From e9c514bd9a97078461cac661d1ed6f6d63232749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zieli=C5=84ski?= Date: Wed, 9 Oct 2024 22:45:40 +0200 Subject: [PATCH 1/2] PHP.wasm: Explore WASMFS/OPFS Trying to switch to WASMFS and lean on the native OPFS support see https://github.com/emscripten-core/emscripten/issues/15949 Work in progress --- packages/php-wasm/compile/php/Dockerfile | 51 +- packages/php-wasm/compile/php/php_wasm.c | 124 +- .../compile/php/phpwasm-emscripten-library.js | 11 - packages/php-wasm/node/asyncify/php_7_0.js | 16313 ++++++++------- packages/php-wasm/node/asyncify/php_7_1.js | 16264 ++++++++------- packages/php-wasm/node/asyncify/php_7_2.js | 16306 ++++++++------- packages/php-wasm/node/asyncify/php_7_3.js | 16306 ++++++++------- packages/php-wasm/node/asyncify/php_7_4.js | 16367 ++++++++------- packages/php-wasm/node/asyncify/php_8_0.js | 16412 ++++++++------- packages/php-wasm/node/asyncify/php_8_1.js | 16506 ++++++++------- packages/php-wasm/node/asyncify/php_8_2.js | 16520 +++++++++------- packages/php-wasm/node/asyncify/php_8_3.js | 16520 +++++++++------- packages/php-wasm/node/jspi/php_7_0.js | 15332 +++++++------- packages/php-wasm/node/jspi/php_7_1.js | 15332 +++++++------- packages/php-wasm/node/jspi/php_7_2.js | 15332 +++++++------- packages/php-wasm/node/jspi/php_7_3.js | 15326 +++++++------- packages/php-wasm/node/jspi/php_7_4.js | 15386 +++++++------- packages/php-wasm/node/jspi/php_8_0.js | 15414 +++++++------- packages/php-wasm/node/jspi/php_8_1.js | 15508 ++++++++------- packages/php-wasm/node/jspi/php_8_2.js | 15526 ++++++++------- packages/php-wasm/node/jspi/php_8_3.js | 15526 ++++++++------- packages/php-wasm/universal/src/lib/php.ts | 19 +- .../web/public/php/jspi/8_0_30/php_8_0.wasm | Bin 12310816 -> 12391870 bytes .../php-wasm/web/public/php/jspi/php_8_0.js | 6 +- packages/playground/wordpress/src/boot.ts | 4 + 25 files changed, 154497 insertions(+), 131914 deletions(-) diff --git a/packages/php-wasm/compile/php/Dockerfile b/packages/php-wasm/compile/php/Dockerfile index 030f6b5635..a14c8316b3 100644 --- a/packages/php-wasm/compile/php/Dockerfile +++ b/packages/php-wasm/compile/php/Dockerfile @@ -332,29 +332,12 @@ RUN if [[ "${PHP_VERSION:0:1}" -le "7" && "${PHP_VERSION:2:1}" -le "3" ]]; then echo '#define HAVE_POSIX_READDIR_R 1' >> /root/php-src/main/php_config.h; \ fi; -# Rename the original php_pollfd_for() implementation so that we can link our own version. -RUN /root/replace.sh 's/static inline int php_pollfd_for\(/int php_pollfd_for(php_socket_t fd, int events, struct timeval *timeouttv); static inline int __real_php_pollfd_for(/g' /root/php-src/main/php_network.h - -RUN echo 'extern ssize_t wasm_read(int fd, void *buf, size_t count);' >> /root/php-src/main/php.h; -RUN /root/replace.sh 's/ret = read/ret = wasm_read/g' /root/php-src/main/streams/plain_wrapper.c - # Provide a custom implementation of the php_exec() function that handles spawning # the process inside exec(), passthru(), system(), etc. # We effectively remove the php_exec() implementation from the build by renaming it # to an unused identifier "php_exec_old", and then we mark php_exec as extern. RUN /root/replace.sh 's/PHPAPI int php_exec(.+)$/PHPAPI extern int php_exec\1; int php_exec_old\1/g' /root/php-src/ext/standard/exec.c -# Provide a custom implementation of the VCWD_POPEN() function that handles spawning -# the process inside PHP_FUNCTION(popen). -RUN /root/replace.sh 's/#define VCWD_POPEN.+/#define VCWD_POPEN(command, type) wasm_popen(command,type)/g' /root/php-src/Zend/zend_virtual_cwd.h -RUN echo 'extern FILE *wasm_popen(const char *cmd, const char *mode);' >> /root/php-src/Zend/zend_virtual_cwd.h - -# Provide a custom implementation of the shutdown() function. -RUN perl -pi.bak -e $'s/(\s+)shutdown\(/$1 wasm_shutdown(/g' /root/php-src/sapi/cli/php_cli_server.c -RUN perl -pi.bak -e $'s/(\s+)closesocket\(/$1 wasm_close(/g' /root/php-src/sapi/cli/php_cli_server.c -RUN echo 'extern int wasm_shutdown(int fd, int how);' >> /root/php-src/main/php_config.h; -RUN echo 'extern int wasm_close(int fd);' >> /root/php-src/main/php_config.h; - # Don't ship PHP_FUNCTION(proc_open) with the PHP build # so that we can ship a patched version with php_wasm.c RUN echo '' > /root/php-src/ext/standard/proc_open.h; @@ -363,7 +346,7 @@ RUN echo '' > /root/php-src/ext/standard/proc_open.c; RUN source /root/emsdk/emsdk_env.sh && \ # We're compiling PHP as emscripten's side module... export JSPI_FLAGS=$(if [ "$WITH_JSPI" = "yes" ]; then echo "-sSUPPORT_LONGJMP=wasm -fwasm-exceptions"; else echo ""; fi) && \ - EMCC_FLAGS=" -sSIDE_MODULE -Dsetsockopt=wasm_setsockopt -Dphp_exec=wasm_php_exec $JSPI_FLAGS " \ + EMCC_FLAGS=" -sSIDE_MODULE -Dphp_exec=wasm_php_exec $JSPI_FLAGS " \ # ...which means we must skip all the libraries - they will be provided in the final linking step. EMCC_SKIP="-lz -ledit -ldl -lncurses -lzip -lpng16 -lssl -lcrypto -lxml2 -lc -lm -lsqlite3 /root/lib/lib/libxml2.a /root/lib/lib/libsqlite3.so /root/lib/lib/libsqlite3.a /root/lib/lib/libsqlite3.a /root/lib/lib/libpng16.so /root/lib/lib/libwebp.a /root/lib/lib/libjpeg.a" \ emmake make -j1 @@ -927,7 +910,7 @@ RUN set -euxo pipefail; \ mkdir -p /build/output; \ source /root/emsdk/emsdk_env.sh; \ if [ "$WITH_JSPI" = "yes" ]; then \ - export ASYNCIFY_FLAGS=" -s ASYNCIFY=2 -sSUPPORT_LONGJMP=wasm -fwasm-exceptions -sJSPI_IMPORTS=js_open_process,js_waitpid,js_process_status,js_create_input_device,wasm_setsockopt,wasm_shutdown,wasm_close -sJSPI_EXPORTS=wasm_sleep,wasm_read,emscripten_sleep,wasm_sapi_handle_request,wasm_sapi_request_shutdown,wasm_poll_socket,wrap_select,__wrap_select,select,php_pollfd_for,fflush,wasm_popen,wasm_read,wasm_php_exec,run_cli -s EXTRA_EXPORTED_RUNTIME_METHODS=ccall,PROXYFS,wasmExports,_malloc "; \ + export ASYNCIFY_FLAGS=" -sWASMFS -DWASMFS_SETUP -lopfs.js -s ASYNCIFY=2 -sSUPPORT_LONGJMP=wasm -fwasm-exceptions -sJSPI_IMPORTS=js_open_process,js_waitpid,js_process_status,js_create_input_device,wasm_setsockopt,wasm_shutdown,wasm_close -sJSPI_EXPORTS=php_wasm_init,wasm_sleep,wasm_read,emscripten_sleep,wasm_sapi_handle_request,wasm_sapi_request_shutdown,wasm_poll_socket,wrap_select,__wrap_select,select,php_pollfd_for,fflush,wasm_popen,wasm_read,wasm_php_exec,run_cli -s EXTRA_EXPORTED_RUNTIME_METHODS=ccall,wasmExports,_malloc "; \ echo '#define PLAYGROUND_JSPI 1' > /root/php_wasm_asyncify.h; \ else \ export ASYNCIFY_FLAGS=" -s ASYNCIFY=1 -s ASYNCIFY_IGNORE_INDIRECT=1 -s EXPORTED_RUNTIME_METHODS=ccall,PROXYFS,wasmExports $(cat /root/.emcc-php-asyncify-flags) "; \ @@ -939,6 +922,7 @@ RUN set -euxo pipefail; \ "lengthBytesUTF8", \n\ "FS", \n\ "___wrap_select", \n\ +"_emscripten_stack_get_current", \n\ "_wasm_set_sapi_name", \n\ "_php_wasm_init", \n\ "_emscripten_sleep", \n\ @@ -975,7 +959,6 @@ RUN set -euxo pipefail; \ -I TSRM/ \ -I /root/lib/include \ -L/root/lib -L/root/lib/lib/ \ - -lproxyfs.js \ $ASYNCIFY_FLAGS \ $(cat /root/.emcc-php-wasm-flags) \ -s EXPORTED_FUNCTIONS="$EXPORTED_FUNCTIONS" \ @@ -1034,21 +1017,21 @@ RUN set -euxo pipefail; \ # Emscripten produces an if that checks a stream.stream_ops.poll property. However, # stream.stream_ops is sometimes undefined and the check fails. Let's adjust it to # tolerate a null stream.stream_ops value. - /root/replace.sh "s/if\s*\(stream\.stream_ops\.poll\)/if (stream.stream_ops?.poll)/g" /root/output/php.js; \ + # /root/replace.sh "s/if\s*\(stream\.stream_ops\.poll\)/if (stream.stream_ops?.poll)/g" /root/output/php.js; \ # Make Emscripten websockets configurable # Emscripten makes the Websocket proxy connect to a fixed URL. # This assumes the traffic is always forwarded to the same target. # However, we want to support arbitrary targets, so we need to # replace the hardcoded websocket target URL with a dynamic callback. - /root/replace.sh $'s/if\s*\(\s*["\']string["\']\s*===\s*typeof Module\[["\']websocket["\']\]\[["\']url["\']\]\s*\)/if("function"===typeof Module["websocket"]["url"]) {\nurl = Module["websocket"]["url"](...arguments);\n}else if ("string" === typeof Module["websocket"]["url"])/g' \ - /root/output/php.js; \ + # /root/replace.sh $'s/if\s*\(\s*["\']string["\']\s*===\s*typeof Module\[["\']websocket["\']\]\[["\']url["\']\]\s*\)/if("function"===typeof Module["websocket"]["url"]) {\nurl = Module["websocket"]["url"](...arguments);\n}else if ("string" === typeof Module["websocket"]["url"])/g' \ + # /root/output/php.js; \ # Enable custom WebSocket constructors to support socket options. - /root/replace.sh "s/ws\s*=\s*new WebSocketConstructor/if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor/g" /root/output/php.js && \ - if [ "$EMSCRIPTEN_ENVIRONMENT" = "node" ]; then \ - if [ "$WITH_WS_NETWORKING_PROXY" = "yes" ]; then \ - /root/replace.sh "s/sock\.server\s*=\s*new WebSocketServer/if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer/g" /root/output/php.js; \ - fi; \ - fi; \ + # /root/replace.sh "s/ws\s*=\s*new WebSocketConstructor/if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor/g" /root/output/php.js && \ + # if [ "$EMSCRIPTEN_ENVIRONMENT" = "node" ]; then \ + # if [ "$WITH_WS_NETWORKING_PROXY" = "yes" ]; then \ + # /root/replace.sh "s/sock\.server\s*=\s*new WebSocketServer/if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer/g" /root/output/php.js; \ + # fi; \ + # fi; \ # Add MSG_PEEK flag support in recvfrom # # Emscripten ignores the flags argument to ___syscall_recvfrom. @@ -1060,11 +1043,11 @@ RUN set -euxo pipefail; \ # reading the remaining "TTP/1.1 200 OK" and not recognizing it as a valid # status line. # We need to patch the syscall to support the MSG_PEEK flag. - if [ "$WITH_WS_NETWORKING_PROXY" = "yes" ]; then \ - /root/replace.sh 's/sock\.sock_ops\.recvmsg\(sock,\s*len\);/sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0);/g' /root/output/php.js; \ - /root/replace.sh 's/recvmsg\(sock,\s*length\)\s*{/recvmsg(sock, length, flags) {/g' /root/output/php.js; \ - /root/replace.sh 's/if\s*\(sock\.type\s*===\s*1\s*&&\s*bytesRead\s*<\s*queuedLength\)/if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength)/g' /root/output/php.js; \ - fi ; \ + # if [ "$WITH_WS_NETWORKING_PROXY" = "yes" ]; then \ + # /root/replace.sh 's/sock\.sock_ops\.recvmsg\(sock,\s*len\);/sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0);/g' /root/output/php.js; \ + # /root/replace.sh 's/recvmsg\(sock,\s*length\)\s*{/recvmsg(sock, length, flags) {/g' /root/output/php.js; \ + # /root/replace.sh 's/if\s*\(sock\.type\s*===\s*1\s*&&\s*bytesRead\s*<\s*queuedLength\)/if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength)/g' /root/output/php.js; \ + # fi ; \ # Replace the hardcoded ENVIRONMENT variable with a dynamic computation # # The JavaScript code of the web loader and web worker loader is identical, diff --git a/packages/php-wasm/compile/php/php_wasm.c b/packages/php-wasm/compile/php/php_wasm.c index 7e15e760a3..01c200573a 100644 --- a/packages/php-wasm/compile/php/php_wasm.c +++ b/packages/php-wasm/compile/php/php_wasm.c @@ -29,6 +29,7 @@ // Created by Dockerfile: #include "php_wasm_asyncify.h" +#include unsigned int wasm_sleep(unsigned int time) { @@ -118,7 +119,6 @@ EM_JS(char*, js_popen_to_file, (const char *command, const char *mode, uint8_t * }); }); - /** * Shims poll(2) functionallity for asynchronous websockets: * https://man7.org/linux/man-pages/man2/poll.2.html @@ -247,112 +247,7 @@ EM_JS(int, wasm_poll_socket, (php_socket_t socketd, int events, int timeout), { }); }); -/** - * Shims read(2) functionallity. - * Enables reading from blocking pipes. By default, Emscripten - * will throw an EWOULDBLOCK error when trying to read from a - * blocking pipe. This function overrides that behavior and - * instead waits for the pipe to become readable. - * - * @see https://github.com/WordPress/wordpress-playground/issues/951 - * @see https://github.com/emscripten-core/emscripten/issues/13214 - */ -#ifdef PLAYGROUND_JSPI -EM_ASYNC_JS(__wasi_errno_t, js_fd_read, (__wasi_fd_t fd, const __wasi_iovec_t *iov, size_t iovcnt, __wasi_size_t *pnum), { - const returnCallback = (resolver) => new Promise(resolver); -#else -EM_JS(__wasi_errno_t, js_fd_read, (__wasi_fd_t fd, const __wasi_iovec_t *iov, size_t iovcnt, __wasi_size_t *pnum), { - const returnCallback = (resolver) => Asyncify.handleSleep(resolver); -#endif - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try - { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } - catch (e) - { - // Rethrow any unexpected non-filesystem errors. - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) - { - throw e; - } - // Only return synchronously if this isn't an asynchronous pipe. - // Error code 6 indicates EWOULDBLOCK – this is our signal to wait. - // We also need to distinguish between a process pipe and a file pipe, otherwise - // reading from an empty file would block until the timeout. - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) - { - // On failure, yield 0 bytes read to indicate EOF. - HEAPU32[pnum >> 2] = 0; - return returnCode - } - } - } - - // At this point we know we have to poll. - // You might wonder why we duplicate the code here instead of always using - // Asyncify.handleSleep(). The reason is performance. Most of the time, - // the read operation will work synchronously and won't require yielding - // back to JS. In these cases we don't want to pay the Asyncify overhead, - // save the stack, yield back to JS, restore the stack etc. - return returnCallback((wakeUp) => { - var retries = 0; - var interval = 50; - var timeout = 5000; - // We poll for data and give up after a timeout. - // We can't simply rely on PHP timeout here because we don't want - // to, say, block the entire PHPUnit test suite without any visible - // feedback. - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if ( - typeof FS == 'undefined' || - !(e.name === 'ErrnoError') - ) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = ( - ++retries > maxRetries || - !(fd in PHPWASM.child_proc_by_fd) || - PHPWASM.child_proc_by_fd[fd]?.exited || - FS.isClosed(stream) - ); - - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - // On failure, yield 0 bytes read to indicate EOF. - HEAPU32[pnum >> 2] = 0; - // If the failure is due to a timeout, return 0 to indicate that we - // reached EOF. Otherwise, propagate the error code. - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }) -}); extern int __wasi_syscall_ret(__wasi_errno_t code); // Exit code of the last exited child process call. @@ -1825,6 +1720,23 @@ static void wasm_sapi_log_message(char *message TSRMLS_DC) */ int php_wasm_init() { + int err; + // backend_t memory = wasmfs_create_memory_backend(); + // The /internal directory is required by the C module. It's where the + // stdout, stderr, and headers information are written for the JavaScript + // code to read later on. + // err = wasmfs_create_directory("/internal", 0777, memory); + // err = wasmfs_create_directory("/wordpress", 0777, memory); + // The files from the shared directory are shared between all the + // PHP processes managed by PHPProcessManager. + // FS.mkdir('/internal/shared'); + // The files from the preload directory are preloaded using the + // auto_prepend_file php.ini directive. + // FS.mkdir('/internal/shared/preload'); + + backend_t opfs = wasmfs_create_opfs_backend(); + err = wasmfs_create_directory("/internal", 0777, opfs); + wasm_server_context = malloc(sizeof(wasm_server_context_t)); wasm_init_server_context(); diff --git a/packages/php-wasm/compile/php/phpwasm-emscripten-library.js b/packages/php-wasm/compile/php/phpwasm-emscripten-library.js index f9bf6ebd38..5bbb8857bd 100644 --- a/packages/php-wasm/compile/php/phpwasm-emscripten-library.js +++ b/packages/php-wasm/compile/php/phpwasm-emscripten-library.js @@ -16,17 +16,6 @@ const LibraryExample = { // JavaScript library under the PHPWASM object: $PHPWASM: { init: function () { - // The /internal directory is required by the C module. It's where the - // stdout, stderr, and headers information are written for the JavaScript - // code to read later on. - FS.mkdir('/internal'); - // The files from the shared directory are shared between all the - // PHP processes managed by PHPProcessManager. - FS.mkdir('/internal/shared'); - // The files from the preload directory are preloaded using the - // auto_prepend_file php.ini directive. - FS.mkdir('/internal/shared/preload'); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require('events').EventEmitter : class EventEmitter { diff --git a/packages/php-wasm/node/asyncify/php_7_0.js b/packages/php-wasm/node/asyncify/php_7_0.js index 703cc7756b..861d7526bd 100644 --- a/packages/php-wasm/node/asyncify/php_7_0.js +++ b/packages/php-wasm/node/asyncify/php_7_0.js @@ -1,6605 +1,7648 @@ -const dependencyFilename = __dirname + '/7_0_33/php_7_0.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 13086044; +const dependencyFilename = __dirname + '/7_0_33/php_7_0.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 13086044; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - return { - "a": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["Ya"]; - updateMemoryViews(); - wasmTable = wasmExports["ab"]; - addOnInit(wasmExports["Za"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function js_popen_to_file(command, mode, exitCodePtr) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); -} - -function wasm_poll_socket(socketd, events, timeout) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); -} - -function js_fd_read(fd, iov, iovcnt, pnum) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); -} - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var stackRestore = val => __emscripten_stack_restore(val); - -var stackSave = () => _emscripten_stack_get_current(); - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -var __emscripten_throw_longjmp = () => { - throw Infinity; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + return { + a: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['Ya']; + updateMemoryViews(); + wasmTable = wasmExports['ab']; + addOnInit(wasmExports['Za']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function js_popen_to_file(command, mode, exitCodePtr) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce((acc, curr) => acc + curr.length, 0) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + } + + function wasm_poll_socket(socketd, events, timeout) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + } + + function js_fd_read(fd, iov, iovcnt, pnum) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + } + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + var __emscripten_throw_longjmp = () => { + throw Infinity; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6610,889 +7653,1199 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -/** @type {WebAssembly.Table} */ var wasmTable; - -var runAndAbortIfError = func => { - try { - return func(); - } catch (e) { - abort(e); - } -}; - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - } - } - }, - instrumentWasmExports(exports) { - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - ret[x] = (...args) => { - Asyncify.exportCallStack.push(x); - try { - return original(...args); - } finally { - if (!ABORT) { - var y = Asyncify.exportCallStack.pop(); - Asyncify.maybeStopUnwind(); - } - } - }; - } else { - ret[x] = original; - } - } - return ret; - }, - State: { - Normal: 0, - Unwinding: 1, - Rewinding: 2, - Disabled: 3 - }, - state: 0, - StackSize: 4096, - currData: null, - handleSleepReturnValue: 0, - exportCallStack: [], - callStackNameToId: {}, - callStackIdToName: {}, - callStackId: 0, - asyncPromiseHandlers: null, - sleepCallbacks: [], - getCallStackId(funcName) { - var id = Asyncify.callStackNameToId[funcName]; - if (id === undefined) { - id = Asyncify.callStackId++; - Asyncify.callStackNameToId[funcName] = id; - Asyncify.callStackIdToName[id] = funcName; - } - return id; - }, - maybeStopUnwind() { - if (Asyncify.currData && Asyncify.state === Asyncify.State.Unwinding && Asyncify.exportCallStack.length === 0) { - Asyncify.state = Asyncify.State.Normal; - runtimeKeepalivePush(); - runAndAbortIfError(_asyncify_stop_unwind); - if (typeof Fibers != "undefined") { - Fibers.trampoline(); - } - } - }, - whenDone() { - return new Promise((resolve, reject) => { - Asyncify.asyncPromiseHandlers = { - resolve: resolve, - reject: 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)] = stack; - HEAPU32[(((ptr) + (4)) >> 2)] = stack + stackSize; - }, - setDataRewindFunc(ptr) { - var bottomOfCallStack = Asyncify.exportCallStack[0]; - var rewindId = Asyncify.getCallStackId(bottomOfCallStack); - HEAP32[(((ptr) + (8)) >> 2)] = rewindId; - }, - getDataRewindFuncName(ptr) { - var id = HEAP32[(((ptr) + (8)) >> 2)]; - var name = Asyncify.callStackIdToName[id]; - return name; - }, - getDataRewindFunc(name) { - var func = wasmExports[name]; - return func; - }, - doRewind(ptr) { - var name = Asyncify.getDataRewindFuncName(ptr); - var func = Asyncify.getDataRewindFunc(name); - runtimeKeepalivePop(); - return 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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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) { - return Asyncify.handleSleep(wakeUp => { - startAsync().then(wakeUp); - }); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var previousAsync = Asyncify.currData; - var ret = func(...cArgs); - function onDone(ret) { - runtimeKeepalivePop(); - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - runtimeKeepalivePush(); - if (Asyncify.currData != previousAsync) { - return Asyncify.whenDone().then(onDone); - } - ret = onDone(ret); - if (asyncMode) return Promise.resolve(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ l: ___assert_fail, - /** @export */ V: __asyncjs__js_module_onMessage, - /** @export */ Xa: ___call_sighandler, - /** @export */ Wa: ___syscall_accept4, - /** @export */ Va: ___syscall_bind, - /** @export */ Ua: ___syscall_chdir, - /** @export */ O: ___syscall_chmod, - /** @export */ Ta: ___syscall_connect, - /** @export */ Sa: ___syscall_dup, - /** @export */ Ra: ___syscall_dup3, - /** @export */ Qa: ___syscall_faccessat, - /** @export */ Pa: ___syscall_fchmod, - /** @export */ Oa: ___syscall_fchown32, - /** @export */ N: ___syscall_fchownat, - /** @export */ k: ___syscall_fcntl64, - /** @export */ Na: ___syscall_fstat64, - /** @export */ ba: ___syscall_ftruncate64, - /** @export */ Ma: ___syscall_getcwd, - /** @export */ La: ___syscall_getdents64, - /** @export */ Ka: ___syscall_getpeername, - /** @export */ Ja: ___syscall_getsockname, - /** @export */ Ia: ___syscall_getsockopt, - /** @export */ C: ___syscall_ioctl, - /** @export */ Ha: ___syscall_listen, - /** @export */ Ga: ___syscall_lstat64, - /** @export */ Fa: ___syscall_mkdirat, - /** @export */ Ea: ___syscall_newfstatat, - /** @export */ B: ___syscall_openat, - /** @export */ Da: ___syscall_pipe, - /** @export */ Ca: ___syscall_poll, - /** @export */ Ba: ___syscall_readlinkat, - /** @export */ Aa: ___syscall_recvfrom, - /** @export */ za: ___syscall_renameat, - /** @export */ M: ___syscall_rmdir, - /** @export */ ya: ___syscall_sendto, - /** @export */ L: ___syscall_socket, - /** @export */ xa: ___syscall_stat64, - /** @export */ wa: ___syscall_statfs64, - /** @export */ va: ___syscall_symlink, - /** @export */ K: ___syscall_unlinkat, - /** @export */ ua: ___syscall_utimensat, - /** @export */ pa: __abort_js, - /** @export */ oa: __emscripten_get_now_is_monotonic, - /** @export */ na: __emscripten_lookup_name, - /** @export */ ma: __emscripten_memcpy_js, - /** @export */ la: __emscripten_runtime_keepalive_clear, - /** @export */ ka: __emscripten_throw_longjmp, - /** @export */ fa: __gmtime_js, - /** @export */ ga: __localtime_js, - /** @export */ $: __mktime_js, - /** @export */ da: __mmap_js, - /** @export */ ea: __munmap_js, - /** @export */ H: __setitimer_js, - /** @export */ ja: __tzset_js, - /** @export */ z: _emscripten_date_now, - /** @export */ ia: _emscripten_get_heap_max, - /** @export */ u: _emscripten_get_now, - /** @export */ ha: _emscripten_resize_heap, - /** @export */ G: _emscripten_sleep, - /** @export */ ta: _environ_get, - /** @export */ sa: _environ_sizes_get, - /** @export */ n: _exit, - /** @export */ s: _fd_close, - /** @export */ J: _fd_fdstat_get, - /** @export */ I: _fd_read, - /** @export */ aa: _fd_seek, - /** @export */ ra: _fd_sync, - /** @export */ A: _fd_write, - /** @export */ _: _getaddrinfo, - /** @export */ F: _getnameinfo, - /** @export */ Z: _getprotobyname, - /** @export */ Y: _getprotobynumber, - /** @export */ i: invoke_i, - /** @export */ d: invoke_ii, - /** @export */ b: invoke_iii, - /** @export */ f: invoke_iiii, - /** @export */ g: invoke_iiiii, - /** @export */ r: invoke_iiiiii, - /** @export */ y: invoke_iiiiiii, - /** @export */ v: invoke_iiiiiiii, - /** @export */ X: invoke_iiiiiiiii, - /** @export */ x: invoke_iiiiiiiiii, - /** @export */ ca: invoke_jii, - /** @export */ e: invoke_v, - /** @export */ a: invoke_vi, - /** @export */ c: invoke_vii, - /** @export */ h: invoke_viii, - /** @export */ o: invoke_viiii, - /** @export */ m: invoke_viiiii, - /** @export */ j: invoke_viiiiii, - /** @export */ w: invoke_viiiiiiiii, - /** @export */ E: _js_create_input_device, - /** @export */ W: js_fd_read, - /** @export */ D: _js_open_process, - /** @export */ U: js_popen_to_file, - /** @export */ T: _js_process_status, - /** @export */ S: _js_waitpid, - /** @export */ qa: _proc_exit, - /** @export */ R: _strftime, - /** @export */ Q: _strftime_l, - /** @export */ P: _strptime, - /** @export */ p: _wasm_close, - /** @export */ t: wasm_poll_socket, - /** @export */ q: _wasm_setsockopt -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["Za"])(); - -var _malloc = a0 => (_malloc = wasmExports["_a"])(a0); - -var _free = a0 => (_free = wasmExports["$a"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["bb"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["cb"])(a0); - -var _htons = a0 => (_htons = wasmExports["db"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["eb"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["fb"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["gb"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["hb"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["ib"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["jb"])(a0, a1, a2); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["kb"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["lb"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["mb"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["nb"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["ob"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["pb"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["qb"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["rb"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["sb"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["tb"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["ub"])(a0); - -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["vb"])(a0); - -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["wb"])(a0); - -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["xb"])(a0); - -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["yb"])(a0); - -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["zb"])(a0); - -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["Ab"])(a0); - -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["Bb"])(a0); - -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["Cb"])(); - -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["Db"])(); - -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["Eb"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["Fb"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["Gb"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["Hb"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["Ib"])(a0, a1); - -var _setThrew = (a0, a1) => (_setThrew = wasmExports["Jb"])(a0, a1); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["Kb"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["Lb"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["Mb"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["Nb"])(); - -var dynCall_viii = Module["dynCall_viii"] = (a0, a1, a2, a3) => (dynCall_viii = Module["dynCall_viii"] = wasmExports["Ob"])(a0, a1, a2, a3); - -var dynCall_vii = Module["dynCall_vii"] = (a0, a1, a2) => (dynCall_vii = Module["dynCall_vii"] = wasmExports["Pb"])(a0, a1, a2); - -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["Qb"])(a0, a1); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + /** @type {WebAssembly.Table} */ var wasmTable; + + var runAndAbortIfError = (func) => { + try { + return func(); + } catch (e) { + abort(e); + } + }; + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + } + } + }, + instrumentWasmExports(exports) { + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + ret[x] = (...args) => { + Asyncify.exportCallStack.push(x); + try { + return original(...args); + } finally { + if (!ABORT) { + var y = Asyncify.exportCallStack.pop(); + Asyncify.maybeStopUnwind(); + } + } + }; + } else { + ret[x] = original; + } + } + return ret; + }, + State: { + Normal: 0, + Unwinding: 1, + Rewinding: 2, + Disabled: 3, + }, + state: 0, + StackSize: 4096, + currData: null, + handleSleepReturnValue: 0, + exportCallStack: [], + callStackNameToId: {}, + callStackIdToName: {}, + callStackId: 0, + asyncPromiseHandlers: null, + sleepCallbacks: [], + getCallStackId(funcName) { + var id = Asyncify.callStackNameToId[funcName]; + if (id === undefined) { + id = Asyncify.callStackId++; + Asyncify.callStackNameToId[funcName] = id; + Asyncify.callStackIdToName[id] = funcName; + } + return id; + }, + maybeStopUnwind() { + if ( + Asyncify.currData && + Asyncify.state === Asyncify.State.Unwinding && + Asyncify.exportCallStack.length === 0 + ) { + Asyncify.state = Asyncify.State.Normal; + runtimeKeepalivePush(); + runAndAbortIfError(_asyncify_stop_unwind); + if (typeof Fibers != 'undefined') { + Fibers.trampoline(); + } + } + }, + whenDone() { + return new Promise((resolve, reject) => { + Asyncify.asyncPromiseHandlers = { + resolve: resolve, + reject: 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] = stack; + HEAPU32[(ptr + 4) >> 2] = stack + stackSize; + }, + setDataRewindFunc(ptr) { + var bottomOfCallStack = Asyncify.exportCallStack[0]; + var rewindId = Asyncify.getCallStackId(bottomOfCallStack); + HEAP32[(ptr + 8) >> 2] = rewindId; + }, + getDataRewindFuncName(ptr) { + var id = HEAP32[(ptr + 8) >> 2]; + var name = Asyncify.callStackIdToName[id]; + return name; + }, + getDataRewindFunc(name) { + var func = wasmExports[name]; + return func; + }, + doRewind(ptr) { + var name = Asyncify.getDataRewindFuncName(ptr); + var func = Asyncify.getDataRewindFunc(name); + runtimeKeepalivePop(); + return 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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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) { + return Asyncify.handleSleep((wakeUp) => { + startAsync().then(wakeUp); + }); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var previousAsync = Asyncify.currData; + var ret = func(...cArgs); + function onDone(ret) { + runtimeKeepalivePop(); + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + runtimeKeepalivePush(); + if (Asyncify.currData != previousAsync) { + return Asyncify.whenDone().then(onDone); + } + ret = onDone(ret); + if (asyncMode) return Promise.resolve(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ l: ___assert_fail, + /** @export */ V: __asyncjs__js_module_onMessage, + /** @export */ Xa: ___call_sighandler, + /** @export */ Wa: ___syscall_accept4, + /** @export */ Va: ___syscall_bind, + /** @export */ Ua: ___syscall_chdir, + /** @export */ O: ___syscall_chmod, + /** @export */ Ta: ___syscall_connect, + /** @export */ Sa: ___syscall_dup, + /** @export */ Ra: ___syscall_dup3, + /** @export */ Qa: ___syscall_faccessat, + /** @export */ Pa: ___syscall_fchmod, + /** @export */ Oa: ___syscall_fchown32, + /** @export */ N: ___syscall_fchownat, + /** @export */ k: ___syscall_fcntl64, + /** @export */ Na: ___syscall_fstat64, + /** @export */ ba: ___syscall_ftruncate64, + /** @export */ Ma: ___syscall_getcwd, + /** @export */ La: ___syscall_getdents64, + /** @export */ Ka: ___syscall_getpeername, + /** @export */ Ja: ___syscall_getsockname, + /** @export */ Ia: ___syscall_getsockopt, + /** @export */ C: ___syscall_ioctl, + /** @export */ Ha: ___syscall_listen, + /** @export */ Ga: ___syscall_lstat64, + /** @export */ Fa: ___syscall_mkdirat, + /** @export */ Ea: ___syscall_newfstatat, + /** @export */ B: ___syscall_openat, + /** @export */ Da: ___syscall_pipe, + /** @export */ Ca: ___syscall_poll, + /** @export */ Ba: ___syscall_readlinkat, + /** @export */ Aa: ___syscall_recvfrom, + /** @export */ za: ___syscall_renameat, + /** @export */ M: ___syscall_rmdir, + /** @export */ ya: ___syscall_sendto, + /** @export */ L: ___syscall_socket, + /** @export */ xa: ___syscall_stat64, + /** @export */ wa: ___syscall_statfs64, + /** @export */ va: ___syscall_symlink, + /** @export */ K: ___syscall_unlinkat, + /** @export */ ua: ___syscall_utimensat, + /** @export */ pa: __abort_js, + /** @export */ oa: __emscripten_get_now_is_monotonic, + /** @export */ na: __emscripten_lookup_name, + /** @export */ ma: __emscripten_memcpy_js, + /** @export */ la: __emscripten_runtime_keepalive_clear, + /** @export */ ka: __emscripten_throw_longjmp, + /** @export */ fa: __gmtime_js, + /** @export */ ga: __localtime_js, + /** @export */ $: __mktime_js, + /** @export */ da: __mmap_js, + /** @export */ ea: __munmap_js, + /** @export */ H: __setitimer_js, + /** @export */ ja: __tzset_js, + /** @export */ z: _emscripten_date_now, + /** @export */ ia: _emscripten_get_heap_max, + /** @export */ u: _emscripten_get_now, + /** @export */ ha: _emscripten_resize_heap, + /** @export */ G: _emscripten_sleep, + /** @export */ ta: _environ_get, + /** @export */ sa: _environ_sizes_get, + /** @export */ n: _exit, + /** @export */ s: _fd_close, + /** @export */ J: _fd_fdstat_get, + /** @export */ I: _fd_read, + /** @export */ aa: _fd_seek, + /** @export */ ra: _fd_sync, + /** @export */ A: _fd_write, + /** @export */ _: _getaddrinfo, + /** @export */ F: _getnameinfo, + /** @export */ Z: _getprotobyname, + /** @export */ Y: _getprotobynumber, + /** @export */ i: invoke_i, + /** @export */ d: invoke_ii, + /** @export */ b: invoke_iii, + /** @export */ f: invoke_iiii, + /** @export */ g: invoke_iiiii, + /** @export */ r: invoke_iiiiii, + /** @export */ y: invoke_iiiiiii, + /** @export */ v: invoke_iiiiiiii, + /** @export */ X: invoke_iiiiiiiii, + /** @export */ x: invoke_iiiiiiiiii, + /** @export */ ca: invoke_jii, + /** @export */ e: invoke_v, + /** @export */ a: invoke_vi, + /** @export */ c: invoke_vii, + /** @export */ h: invoke_viii, + /** @export */ o: invoke_viiii, + /** @export */ m: invoke_viiiii, + /** @export */ j: invoke_viiiiii, + /** @export */ w: invoke_viiiiiiiii, + /** @export */ E: _js_create_input_device, + /** @export */ W: js_fd_read, + /** @export */ D: _js_open_process, + /** @export */ U: js_popen_to_file, + /** @export */ T: _js_process_status, + /** @export */ S: _js_waitpid, + /** @export */ qa: _proc_exit, + /** @export */ R: _strftime, + /** @export */ Q: _strftime_l, + /** @export */ P: _strptime, + /** @export */ p: _wasm_close, + /** @export */ t: wasm_poll_socket, + /** @export */ q: _wasm_setsockopt, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports['Za'])(); + + var _malloc = (a0) => (_malloc = wasmExports['_a'])(a0); + + var _free = (a0) => (_free = wasmExports['$a'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['bb'])(a0)); + + var _ntohs = (a0) => (_ntohs = wasmExports['cb'])(a0); + + var _htons = (a0) => (_htons = wasmExports['db'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['eb'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['fb'])(a0, a1, a2)); + + var _fflush = (a0) => (_fflush = wasmExports['gb'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['hb'])(a0, a1)); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = wasmExports['ib'])( + a0, + a1, + a2, + a3 + )); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = wasmExports['jb'])( + a0, + a1, + a2 + )); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = wasmExports['kb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = wasmExports['lb'])( + a0 + )); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['mb'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['nb'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['ob'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['pb'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['qb'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['rb'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['sb'])(a0)); -var dynCall_iii = Module["dynCall_iii"] = (a0, a1, a2) => (dynCall_iii = Module["dynCall_iii"] = wasmExports["Rb"])(a0, a1, a2); + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['tb'])(a0)); -var dynCall_ii = Module["dynCall_ii"] = (a0, a1) => (dynCall_ii = Module["dynCall_ii"] = wasmExports["Sb"])(a0, a1); + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['ub'])(a0)); -var dynCall_v = Module["dynCall_v"] = a0 => (dynCall_v = Module["dynCall_v"] = wasmExports["Tb"])(a0); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['vb'])(a0)); -var dynCall_iiii = Module["dynCall_iiii"] = (a0, a1, a2, a3) => (dynCall_iiii = Module["dynCall_iiii"] = wasmExports["Ub"])(a0, a1, a2, a3); + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['wb'])(a0)); -var dynCall_viiiii = Module["dynCall_viiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viiiii = Module["dynCall_viiiii"] = wasmExports["Vb"])(a0, a1, a2, a3, a4, a5); - -var dynCall_iiiii = Module["dynCall_iiiii"] = (a0, a1, a2, a3, a4) => (dynCall_iiiii = Module["dynCall_iiiii"] = wasmExports["Wb"])(a0, a1, a2, a3, a4); - -var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_iiiiiii = Module["dynCall_iiiiiii"] = wasmExports["Xb"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_iiiiii = Module["dynCall_iiiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_iiiiii = Module["dynCall_iiiiii"] = wasmExports["Yb"])(a0, a1, a2, a3, a4, a5); - -var dynCall_i = Module["dynCall_i"] = a0 => (dynCall_i = Module["dynCall_i"] = wasmExports["Zb"])(a0); - -var dynCall_viiii = Module["dynCall_viiii"] = (a0, a1, a2, a3, a4) => (dynCall_viiii = Module["dynCall_viiii"] = wasmExports["_b"])(a0, a1, a2, a3, a4); - -var dynCall_iiiiiiiii = Module["dynCall_iiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8) => (dynCall_iiiiiiiii = Module["dynCall_iiiiiiiii"] = wasmExports["$b"])(a0, a1, a2, a3, a4, a5, a6, a7, a8); - -var dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = wasmExports["ac"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_viiiiii = Module["dynCall_viiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_viiiiii = Module["dynCall_viiiiii"] = wasmExports["bc"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = wasmExports["cc"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = wasmExports["dc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_jii = Module["dynCall_jii"] = (a0, a1, a2) => (dynCall_jii = Module["dynCall_jii"] = wasmExports["ec"])(a0, a1, a2); - -var _asyncify_start_unwind = a0 => (_asyncify_start_unwind = wasmExports["fc"])(a0); - -var _asyncify_stop_unwind = () => (_asyncify_stop_unwind = wasmExports["gc"])(); - -var _asyncify_start_rewind = a0 => (_asyncify_start_rewind = wasmExports["hc"])(a0); - -var _asyncify_stop_rewind = () => (_asyncify_stop_rewind = wasmExports["ic"])(); - -function invoke_viii(index, a1, a2, a3) { - var sp = stackSave(); - try { - dynCall_viii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vii(index, a1, a2) { - var sp = stackSave(); - try { - dynCall_vii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vi(index, a1) { - var sp = stackSave(); - try { - dynCall_vi(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_iii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_v(index) { - var sp = stackSave(); - try { - dynCall_v(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_ii(index, a1) { - var sp = stackSave(); - try { - return dynCall_ii(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_i(index) { - var sp = stackSave(); - try { - return dynCall_i(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - dynCall_viiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8) { - var sp = stackSave(); - try { - return dynCall_iiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - return dynCall_iiiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiii(index, a1, a2, a3) { - var sp = stackSave(); - try { - return dynCall_iiii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - return dynCall_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - return dynCall_iiiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_jii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_jii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['xb'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['yb'])(a0)); + + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['zb'])(a0)); + + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = wasmExports['Ab'])( + a0 + )); + + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['Bb'])(a0)); + + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['Cb'])()); + + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['Db'])()); + + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = wasmExports['Eb'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['Fb'])(a0)); + + var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports['Gb'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = wasmExports['Hb'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['Ib'])(a0, a1); + + var _setThrew = (a0, a1) => (_setThrew = wasmExports['Jb'])(a0, a1); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['Kb'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['Lb'])(a0); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['Mb'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = wasmExports['Nb'])(); + + var dynCall_viii = (Module['dynCall_viii'] = (a0, a1, a2, a3) => + (dynCall_viii = Module['dynCall_viii'] = wasmExports['Ob'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_vii = (Module['dynCall_vii'] = (a0, a1, a2) => + (dynCall_vii = Module['dynCall_vii'] = wasmExports['Pb'])(a0, a1, a2)); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['Qb'])(a0, a1)); + + var dynCall_iii = (Module['dynCall_iii'] = (a0, a1, a2) => + (dynCall_iii = Module['dynCall_iii'] = wasmExports['Rb'])(a0, a1, a2)); + + var dynCall_ii = (Module['dynCall_ii'] = (a0, a1) => + (dynCall_ii = Module['dynCall_ii'] = wasmExports['Sb'])(a0, a1)); + + var dynCall_v = (Module['dynCall_v'] = (a0) => + (dynCall_v = Module['dynCall_v'] = wasmExports['Tb'])(a0)); + + var dynCall_iiii = (Module['dynCall_iiii'] = (a0, a1, a2, a3) => + (dynCall_iiii = Module['dynCall_iiii'] = wasmExports['Ub'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_viiiii = (Module['dynCall_viiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viiiii = Module['dynCall_viiiii'] = wasmExports['Vb'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_iiiii = (Module['dynCall_iiiii'] = (a0, a1, a2, a3, a4) => + (dynCall_iiiii = Module['dynCall_iiiii'] = wasmExports['Wb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iiiiiii = (Module['dynCall_iiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_iiiiiii = Module['dynCall_iiiiiii'] = wasmExports['Xb'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_iiiiii = (Module['dynCall_iiiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_iiiiii = Module['dynCall_iiiiii'] = wasmExports['Yb'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_i = (Module['dynCall_i'] = (a0) => + (dynCall_i = Module['dynCall_i'] = wasmExports['Zb'])(a0)); + + var dynCall_viiii = (Module['dynCall_viiii'] = (a0, a1, a2, a3, a4) => + (dynCall_viiii = Module['dynCall_viiii'] = wasmExports['_b'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iiiiiiiii = (Module['dynCall_iiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8 + ) => + (dynCall_iiiiiiiii = Module['dynCall_iiiiiiiii'] = wasmExports['$b'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8 + )); + + var dynCall_viiiiiiiii = (Module['dynCall_viiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_viiiiiiiii = Module['dynCall_viiiiiiiii'] = wasmExports['ac'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_viiiiii = (Module['dynCall_viiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_viiiiii = Module['dynCall_viiiiii'] = wasmExports['bc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_iiiiiiii = (Module['dynCall_iiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_iiiiiiii = Module['dynCall_iiiiiiii'] = wasmExports['cc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_iiiiiiiiii = (Module['dynCall_iiiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_iiiiiiiiii = Module['dynCall_iiiiiiiiii'] = wasmExports['dc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_jii = (Module['dynCall_jii'] = (a0, a1, a2) => + (dynCall_jii = Module['dynCall_jii'] = wasmExports['ec'])(a0, a1, a2)); + + var _asyncify_start_unwind = (a0) => + (_asyncify_start_unwind = wasmExports['fc'])(a0); + + var _asyncify_stop_unwind = () => + (_asyncify_stop_unwind = wasmExports['gc'])(); + + var _asyncify_start_rewind = (a0) => + (_asyncify_start_rewind = wasmExports['hc'])(a0); + + var _asyncify_stop_rewind = () => + (_asyncify_stop_rewind = wasmExports['ic'])(); + + function invoke_viii(index, a1, a2, a3) { + var sp = stackSave(); + try { + dynCall_viii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vii(index, a1, a2) { + var sp = stackSave(); + try { + dynCall_vii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vi(index, a1) { + var sp = stackSave(); + try { + dynCall_vi(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_iii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_v(index) { + var sp = stackSave(); + try { + dynCall_v(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_ii(index, a1) { + var sp = stackSave(); + try { + return dynCall_ii(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_i(index) { + var sp = stackSave(); + try { + return dynCall_i(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + dynCall_viiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8) { + var sp = stackSave(); + try { + return dynCall_iiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + return dynCall_iiiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiii(index, a1, a2, a3) { + var sp = stackSave(); + try { + return dynCall_iiii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + return dynCall_iiiiiiiiii( + index, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + return dynCall_iiiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_jii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_jii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/asyncify/php_7_1.js b/packages/php-wasm/node/asyncify/php_7_1.js index b8305c5b2f..f2b26b3b11 100644 --- a/packages/php-wasm/node/asyncify/php_7_1.js +++ b/packages/php-wasm/node/asyncify/php_7_1.js @@ -1,6605 +1,7648 @@ -const dependencyFilename = __dirname + '/7_1_30/php_7_1.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 13566339; +const dependencyFilename = __dirname + '/7_1_30/php_7_1.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 13566339; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - return { - "a": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["Xa"]; - updateMemoryViews(); - wasmTable = wasmExports["$a"]; - addOnInit(wasmExports["Ya"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function js_popen_to_file(command, mode, exitCodePtr) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); -} - -function wasm_poll_socket(socketd, events, timeout) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); -} - -function js_fd_read(fd, iov, iovcnt, pnum) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); -} - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var stackRestore = val => __emscripten_stack_restore(val); - -var stackSave = () => _emscripten_stack_get_current(); - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -var __emscripten_throw_longjmp = () => { - throw Infinity; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + return { + a: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['Xa']; + updateMemoryViews(); + wasmTable = wasmExports['$a']; + addOnInit(wasmExports['Ya']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function js_popen_to_file(command, mode, exitCodePtr) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce((acc, curr) => acc + curr.length, 0) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + } + + function wasm_poll_socket(socketd, events, timeout) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + } + + function js_fd_read(fd, iov, iovcnt, pnum) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + } + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + var __emscripten_throw_longjmp = () => { + throw Infinity; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6610,875 +7653,1164 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -/** @type {WebAssembly.Table} */ var wasmTable; - -var runAndAbortIfError = func => { - try { - return func(); - } catch (e) { - abort(e); - } -}; - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - } - } - }, - instrumentWasmExports(exports) { - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - ret[x] = (...args) => { - Asyncify.exportCallStack.push(x); - try { - return original(...args); - } finally { - if (!ABORT) { - var y = Asyncify.exportCallStack.pop(); - Asyncify.maybeStopUnwind(); - } - } - }; - } else { - ret[x] = original; - } - } - return ret; - }, - State: { - Normal: 0, - Unwinding: 1, - Rewinding: 2, - Disabled: 3 - }, - state: 0, - StackSize: 4096, - currData: null, - handleSleepReturnValue: 0, - exportCallStack: [], - callStackNameToId: {}, - callStackIdToName: {}, - callStackId: 0, - asyncPromiseHandlers: null, - sleepCallbacks: [], - getCallStackId(funcName) { - var id = Asyncify.callStackNameToId[funcName]; - if (id === undefined) { - id = Asyncify.callStackId++; - Asyncify.callStackNameToId[funcName] = id; - Asyncify.callStackIdToName[id] = funcName; - } - return id; - }, - maybeStopUnwind() { - if (Asyncify.currData && Asyncify.state === Asyncify.State.Unwinding && Asyncify.exportCallStack.length === 0) { - Asyncify.state = Asyncify.State.Normal; - runtimeKeepalivePush(); - runAndAbortIfError(_asyncify_stop_unwind); - if (typeof Fibers != "undefined") { - Fibers.trampoline(); - } - } - }, - whenDone() { - return new Promise((resolve, reject) => { - Asyncify.asyncPromiseHandlers = { - resolve: resolve, - reject: 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)] = stack; - HEAPU32[(((ptr) + (4)) >> 2)] = stack + stackSize; - }, - setDataRewindFunc(ptr) { - var bottomOfCallStack = Asyncify.exportCallStack[0]; - var rewindId = Asyncify.getCallStackId(bottomOfCallStack); - HEAP32[(((ptr) + (8)) >> 2)] = rewindId; - }, - getDataRewindFuncName(ptr) { - var id = HEAP32[(((ptr) + (8)) >> 2)]; - var name = Asyncify.callStackIdToName[id]; - return name; - }, - getDataRewindFunc(name) { - var func = wasmExports[name]; - return func; - }, - doRewind(ptr) { - var name = Asyncify.getDataRewindFuncName(ptr); - var func = Asyncify.getDataRewindFunc(name); - runtimeKeepalivePop(); - return 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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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) { - return Asyncify.handleSleep(wakeUp => { - startAsync().then(wakeUp); - }); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var previousAsync = Asyncify.currData; - var ret = func(...cArgs); - function onDone(ret) { - runtimeKeepalivePop(); - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - runtimeKeepalivePush(); - if (Asyncify.currData != previousAsync) { - return Asyncify.whenDone().then(onDone); - } - ret = onDone(ret); - if (asyncMode) return Promise.resolve(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ m: ___assert_fail, - /** @export */ V: __asyncjs__js_module_onMessage, - /** @export */ Wa: ___call_sighandler, - /** @export */ Va: ___syscall_accept4, - /** @export */ Ua: ___syscall_bind, - /** @export */ Ta: ___syscall_chdir, - /** @export */ O: ___syscall_chmod, - /** @export */ Sa: ___syscall_connect, - /** @export */ Ra: ___syscall_dup, - /** @export */ Qa: ___syscall_dup3, - /** @export */ Pa: ___syscall_faccessat, - /** @export */ Oa: ___syscall_fchmod, - /** @export */ Na: ___syscall_fchown32, - /** @export */ N: ___syscall_fchownat, - /** @export */ l: ___syscall_fcntl64, - /** @export */ Ma: ___syscall_fstat64, - /** @export */ ba: ___syscall_ftruncate64, - /** @export */ La: ___syscall_getcwd, - /** @export */ Ka: ___syscall_getdents64, - /** @export */ Ja: ___syscall_getpeername, - /** @export */ Ia: ___syscall_getsockname, - /** @export */ Ha: ___syscall_getsockopt, - /** @export */ C: ___syscall_ioctl, - /** @export */ Ga: ___syscall_listen, - /** @export */ Fa: ___syscall_lstat64, - /** @export */ Ea: ___syscall_mkdirat, - /** @export */ Da: ___syscall_newfstatat, - /** @export */ B: ___syscall_openat, - /** @export */ Ca: ___syscall_pipe, - /** @export */ Ba: ___syscall_poll, - /** @export */ Aa: ___syscall_readlinkat, - /** @export */ za: ___syscall_recvfrom, - /** @export */ ya: ___syscall_renameat, - /** @export */ M: ___syscall_rmdir, - /** @export */ xa: ___syscall_sendto, - /** @export */ L: ___syscall_socket, - /** @export */ wa: ___syscall_stat64, - /** @export */ va: ___syscall_statfs64, - /** @export */ ua: ___syscall_symlink, - /** @export */ K: ___syscall_unlinkat, - /** @export */ ta: ___syscall_utimensat, - /** @export */ oa: __abort_js, - /** @export */ na: __emscripten_get_now_is_monotonic, - /** @export */ ma: __emscripten_lookup_name, - /** @export */ la: __emscripten_memcpy_js, - /** @export */ ka: __emscripten_runtime_keepalive_clear, - /** @export */ ja: __emscripten_throw_longjmp, - /** @export */ fa: __gmtime_js, - /** @export */ _: __localtime_js, - /** @export */ $: __mktime_js, - /** @export */ da: __mmap_js, - /** @export */ ea: __munmap_js, - /** @export */ H: __setitimer_js, - /** @export */ ia: __tzset_js, - /** @export */ z: _emscripten_date_now, - /** @export */ ha: _emscripten_get_heap_max, - /** @export */ v: _emscripten_get_now, - /** @export */ ga: _emscripten_resize_heap, - /** @export */ G: _emscripten_sleep, - /** @export */ sa: _environ_get, - /** @export */ ra: _environ_sizes_get, - /** @export */ p: _exit, - /** @export */ s: _fd_close, - /** @export */ J: _fd_fdstat_get, - /** @export */ I: _fd_read, - /** @export */ aa: _fd_seek, - /** @export */ qa: _fd_sync, - /** @export */ A: _fd_write, - /** @export */ Z: _getaddrinfo, - /** @export */ F: _getnameinfo, - /** @export */ Y: _getprotobyname, - /** @export */ X: _getprotobynumber, - /** @export */ i: invoke_i, - /** @export */ c: invoke_ii, - /** @export */ b: invoke_iii, - /** @export */ f: invoke_iiii, - /** @export */ g: invoke_iiiii, - /** @export */ r: invoke_iiiiii, - /** @export */ u: invoke_iiiiiii, - /** @export */ w: invoke_iiiiiiii, - /** @export */ y: invoke_iiiiiiiiii, - /** @export */ ca: invoke_jii, - /** @export */ e: invoke_v, - /** @export */ a: invoke_vi, - /** @export */ d: invoke_vii, - /** @export */ h: invoke_viii, - /** @export */ k: invoke_viiii, - /** @export */ n: invoke_viiiii, - /** @export */ j: invoke_viiiiii, - /** @export */ x: invoke_viiiiiiiii, - /** @export */ E: _js_create_input_device, - /** @export */ W: js_fd_read, - /** @export */ D: _js_open_process, - /** @export */ U: js_popen_to_file, - /** @export */ T: _js_process_status, - /** @export */ S: _js_waitpid, - /** @export */ pa: _proc_exit, - /** @export */ R: _strftime, - /** @export */ Q: _strftime_l, - /** @export */ P: _strptime, - /** @export */ q: _wasm_close, - /** @export */ t: wasm_poll_socket, - /** @export */ o: _wasm_setsockopt -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["Ya"])(); - -var _malloc = a0 => (_malloc = wasmExports["Za"])(a0); - -var _free = a0 => (_free = wasmExports["_a"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["ab"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["bb"])(a0); - -var _htons = a0 => (_htons = wasmExports["cb"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["db"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["eb"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["fb"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["gb"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["hb"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["ib"])(a0, a1, a2); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["jb"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["kb"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["lb"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["mb"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["nb"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["ob"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["pb"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["qb"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["rb"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["sb"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["tb"])(a0); - -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["ub"])(a0); - -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["vb"])(a0); - -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["wb"])(a0); - -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["xb"])(a0); - -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["yb"])(a0); - -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["zb"])(a0); - -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["Ab"])(a0); - -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["Bb"])(); - -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["Cb"])(); - -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["Db"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["Eb"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["Fb"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["Gb"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["Hb"])(a0, a1); - -var _setThrew = (a0, a1) => (_setThrew = wasmExports["Ib"])(a0, a1); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["Jb"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["Kb"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["Lb"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["Mb"])(); - -var dynCall_viii = Module["dynCall_viii"] = (a0, a1, a2, a3) => (dynCall_viii = Module["dynCall_viii"] = wasmExports["Nb"])(a0, a1, a2, a3); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + /** @type {WebAssembly.Table} */ var wasmTable; + + var runAndAbortIfError = (func) => { + try { + return func(); + } catch (e) { + abort(e); + } + }; + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + } + } + }, + instrumentWasmExports(exports) { + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + ret[x] = (...args) => { + Asyncify.exportCallStack.push(x); + try { + return original(...args); + } finally { + if (!ABORT) { + var y = Asyncify.exportCallStack.pop(); + Asyncify.maybeStopUnwind(); + } + } + }; + } else { + ret[x] = original; + } + } + return ret; + }, + State: { + Normal: 0, + Unwinding: 1, + Rewinding: 2, + Disabled: 3, + }, + state: 0, + StackSize: 4096, + currData: null, + handleSleepReturnValue: 0, + exportCallStack: [], + callStackNameToId: {}, + callStackIdToName: {}, + callStackId: 0, + asyncPromiseHandlers: null, + sleepCallbacks: [], + getCallStackId(funcName) { + var id = Asyncify.callStackNameToId[funcName]; + if (id === undefined) { + id = Asyncify.callStackId++; + Asyncify.callStackNameToId[funcName] = id; + Asyncify.callStackIdToName[id] = funcName; + } + return id; + }, + maybeStopUnwind() { + if ( + Asyncify.currData && + Asyncify.state === Asyncify.State.Unwinding && + Asyncify.exportCallStack.length === 0 + ) { + Asyncify.state = Asyncify.State.Normal; + runtimeKeepalivePush(); + runAndAbortIfError(_asyncify_stop_unwind); + if (typeof Fibers != 'undefined') { + Fibers.trampoline(); + } + } + }, + whenDone() { + return new Promise((resolve, reject) => { + Asyncify.asyncPromiseHandlers = { + resolve: resolve, + reject: 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] = stack; + HEAPU32[(ptr + 4) >> 2] = stack + stackSize; + }, + setDataRewindFunc(ptr) { + var bottomOfCallStack = Asyncify.exportCallStack[0]; + var rewindId = Asyncify.getCallStackId(bottomOfCallStack); + HEAP32[(ptr + 8) >> 2] = rewindId; + }, + getDataRewindFuncName(ptr) { + var id = HEAP32[(ptr + 8) >> 2]; + var name = Asyncify.callStackIdToName[id]; + return name; + }, + getDataRewindFunc(name) { + var func = wasmExports[name]; + return func; + }, + doRewind(ptr) { + var name = Asyncify.getDataRewindFuncName(ptr); + var func = Asyncify.getDataRewindFunc(name); + runtimeKeepalivePop(); + return 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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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) { + return Asyncify.handleSleep((wakeUp) => { + startAsync().then(wakeUp); + }); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var previousAsync = Asyncify.currData; + var ret = func(...cArgs); + function onDone(ret) { + runtimeKeepalivePop(); + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + runtimeKeepalivePush(); + if (Asyncify.currData != previousAsync) { + return Asyncify.whenDone().then(onDone); + } + ret = onDone(ret); + if (asyncMode) return Promise.resolve(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ m: ___assert_fail, + /** @export */ V: __asyncjs__js_module_onMessage, + /** @export */ Wa: ___call_sighandler, + /** @export */ Va: ___syscall_accept4, + /** @export */ Ua: ___syscall_bind, + /** @export */ Ta: ___syscall_chdir, + /** @export */ O: ___syscall_chmod, + /** @export */ Sa: ___syscall_connect, + /** @export */ Ra: ___syscall_dup, + /** @export */ Qa: ___syscall_dup3, + /** @export */ Pa: ___syscall_faccessat, + /** @export */ Oa: ___syscall_fchmod, + /** @export */ Na: ___syscall_fchown32, + /** @export */ N: ___syscall_fchownat, + /** @export */ l: ___syscall_fcntl64, + /** @export */ Ma: ___syscall_fstat64, + /** @export */ ba: ___syscall_ftruncate64, + /** @export */ La: ___syscall_getcwd, + /** @export */ Ka: ___syscall_getdents64, + /** @export */ Ja: ___syscall_getpeername, + /** @export */ Ia: ___syscall_getsockname, + /** @export */ Ha: ___syscall_getsockopt, + /** @export */ C: ___syscall_ioctl, + /** @export */ Ga: ___syscall_listen, + /** @export */ Fa: ___syscall_lstat64, + /** @export */ Ea: ___syscall_mkdirat, + /** @export */ Da: ___syscall_newfstatat, + /** @export */ B: ___syscall_openat, + /** @export */ Ca: ___syscall_pipe, + /** @export */ Ba: ___syscall_poll, + /** @export */ Aa: ___syscall_readlinkat, + /** @export */ za: ___syscall_recvfrom, + /** @export */ ya: ___syscall_renameat, + /** @export */ M: ___syscall_rmdir, + /** @export */ xa: ___syscall_sendto, + /** @export */ L: ___syscall_socket, + /** @export */ wa: ___syscall_stat64, + /** @export */ va: ___syscall_statfs64, + /** @export */ ua: ___syscall_symlink, + /** @export */ K: ___syscall_unlinkat, + /** @export */ ta: ___syscall_utimensat, + /** @export */ oa: __abort_js, + /** @export */ na: __emscripten_get_now_is_monotonic, + /** @export */ ma: __emscripten_lookup_name, + /** @export */ la: __emscripten_memcpy_js, + /** @export */ ka: __emscripten_runtime_keepalive_clear, + /** @export */ ja: __emscripten_throw_longjmp, + /** @export */ fa: __gmtime_js, + /** @export */ _: __localtime_js, + /** @export */ $: __mktime_js, + /** @export */ da: __mmap_js, + /** @export */ ea: __munmap_js, + /** @export */ H: __setitimer_js, + /** @export */ ia: __tzset_js, + /** @export */ z: _emscripten_date_now, + /** @export */ ha: _emscripten_get_heap_max, + /** @export */ v: _emscripten_get_now, + /** @export */ ga: _emscripten_resize_heap, + /** @export */ G: _emscripten_sleep, + /** @export */ sa: _environ_get, + /** @export */ ra: _environ_sizes_get, + /** @export */ p: _exit, + /** @export */ s: _fd_close, + /** @export */ J: _fd_fdstat_get, + /** @export */ I: _fd_read, + /** @export */ aa: _fd_seek, + /** @export */ qa: _fd_sync, + /** @export */ A: _fd_write, + /** @export */ Z: _getaddrinfo, + /** @export */ F: _getnameinfo, + /** @export */ Y: _getprotobyname, + /** @export */ X: _getprotobynumber, + /** @export */ i: invoke_i, + /** @export */ c: invoke_ii, + /** @export */ b: invoke_iii, + /** @export */ f: invoke_iiii, + /** @export */ g: invoke_iiiii, + /** @export */ r: invoke_iiiiii, + /** @export */ u: invoke_iiiiiii, + /** @export */ w: invoke_iiiiiiii, + /** @export */ y: invoke_iiiiiiiiii, + /** @export */ ca: invoke_jii, + /** @export */ e: invoke_v, + /** @export */ a: invoke_vi, + /** @export */ d: invoke_vii, + /** @export */ h: invoke_viii, + /** @export */ k: invoke_viiii, + /** @export */ n: invoke_viiiii, + /** @export */ j: invoke_viiiiii, + /** @export */ x: invoke_viiiiiiiii, + /** @export */ E: _js_create_input_device, + /** @export */ W: js_fd_read, + /** @export */ D: _js_open_process, + /** @export */ U: js_popen_to_file, + /** @export */ T: _js_process_status, + /** @export */ S: _js_waitpid, + /** @export */ pa: _proc_exit, + /** @export */ R: _strftime, + /** @export */ Q: _strftime_l, + /** @export */ P: _strptime, + /** @export */ q: _wasm_close, + /** @export */ t: wasm_poll_socket, + /** @export */ o: _wasm_setsockopt, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports['Ya'])(); + + var _malloc = (a0) => (_malloc = wasmExports['Za'])(a0); + + var _free = (a0) => (_free = wasmExports['_a'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['ab'])(a0)); + + var _ntohs = (a0) => (_ntohs = wasmExports['bb'])(a0); + + var _htons = (a0) => (_htons = wasmExports['cb'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['db'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['eb'])(a0, a1, a2)); + + var _fflush = (a0) => (_fflush = wasmExports['fb'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['gb'])(a0, a1)); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = wasmExports['hb'])( + a0, + a1, + a2, + a3 + )); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = wasmExports['ib'])( + a0, + a1, + a2 + )); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = wasmExports['jb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = wasmExports['kb'])( + a0 + )); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['lb'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['mb'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['nb'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['ob'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['pb'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['qb'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['rb'])(a0)); -var dynCall_vii = Module["dynCall_vii"] = (a0, a1, a2) => (dynCall_vii = Module["dynCall_vii"] = wasmExports["Ob"])(a0, a1, a2); + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['sb'])(a0)); -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["Pb"])(a0, a1); + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['tb'])(a0)); -var dynCall_iii = Module["dynCall_iii"] = (a0, a1, a2) => (dynCall_iii = Module["dynCall_iii"] = wasmExports["Qb"])(a0, a1, a2); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['ub'])(a0)); -var dynCall_ii = Module["dynCall_ii"] = (a0, a1) => (dynCall_ii = Module["dynCall_ii"] = wasmExports["Rb"])(a0, a1); + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['vb'])(a0)); -var dynCall_v = Module["dynCall_v"] = a0 => (dynCall_v = Module["dynCall_v"] = wasmExports["Sb"])(a0); - -var dynCall_iiii = Module["dynCall_iiii"] = (a0, a1, a2, a3) => (dynCall_iiii = Module["dynCall_iiii"] = wasmExports["Tb"])(a0, a1, a2, a3); - -var dynCall_iiiii = Module["dynCall_iiiii"] = (a0, a1, a2, a3, a4) => (dynCall_iiiii = Module["dynCall_iiiii"] = wasmExports["Ub"])(a0, a1, a2, a3, a4); - -var dynCall_iiiiii = Module["dynCall_iiiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_iiiiii = Module["dynCall_iiiiii"] = wasmExports["Vb"])(a0, a1, a2, a3, a4, a5); - -var dynCall_viiii = Module["dynCall_viiii"] = (a0, a1, a2, a3, a4) => (dynCall_viiii = Module["dynCall_viiii"] = wasmExports["Wb"])(a0, a1, a2, a3, a4); - -var dynCall_viiiii = Module["dynCall_viiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viiiii = Module["dynCall_viiiii"] = wasmExports["Xb"])(a0, a1, a2, a3, a4, a5); - -var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_iiiiiii = Module["dynCall_iiiiiii"] = wasmExports["Yb"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_i = Module["dynCall_i"] = a0 => (dynCall_i = Module["dynCall_i"] = wasmExports["Zb"])(a0); - -var dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = wasmExports["_b"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_viiiiii = Module["dynCall_viiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_viiiiii = Module["dynCall_viiiiii"] = wasmExports["$b"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = wasmExports["ac"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = wasmExports["bc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_jii = Module["dynCall_jii"] = (a0, a1, a2) => (dynCall_jii = Module["dynCall_jii"] = wasmExports["cc"])(a0, a1, a2); - -var _asyncify_start_unwind = a0 => (_asyncify_start_unwind = wasmExports["dc"])(a0); - -var _asyncify_stop_unwind = () => (_asyncify_stop_unwind = wasmExports["ec"])(); - -var _asyncify_start_rewind = a0 => (_asyncify_start_rewind = wasmExports["fc"])(a0); - -var _asyncify_stop_rewind = () => (_asyncify_stop_rewind = wasmExports["gc"])(); - -function invoke_viii(index, a1, a2, a3) { - var sp = stackSave(); - try { - dynCall_viii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vii(index, a1, a2) { - var sp = stackSave(); - try { - dynCall_vii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vi(index, a1) { - var sp = stackSave(); - try { - dynCall_vi(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_iii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_v(index) { - var sp = stackSave(); - try { - dynCall_v(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_ii(index, a1) { - var sp = stackSave(); - try { - return dynCall_ii(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_i(index) { - var sp = stackSave(); - try { - return dynCall_i(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - dynCall_viiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - return dynCall_iiiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiii(index, a1, a2, a3) { - var sp = stackSave(); - try { - return dynCall_iiii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - return dynCall_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - return dynCall_iiiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_jii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_jii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['wb'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['xb'])(a0)); + + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['yb'])(a0)); + + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = wasmExports['zb'])( + a0 + )); + + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['Ab'])(a0)); + + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['Bb'])()); + + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['Cb'])()); + + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = wasmExports['Db'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['Eb'])(a0)); + + var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports['Fb'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = wasmExports['Gb'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['Hb'])(a0, a1); + + var _setThrew = (a0, a1) => (_setThrew = wasmExports['Ib'])(a0, a1); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['Jb'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['Kb'])(a0); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['Lb'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = wasmExports['Mb'])(); + + var dynCall_viii = (Module['dynCall_viii'] = (a0, a1, a2, a3) => + (dynCall_viii = Module['dynCall_viii'] = wasmExports['Nb'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_vii = (Module['dynCall_vii'] = (a0, a1, a2) => + (dynCall_vii = Module['dynCall_vii'] = wasmExports['Ob'])(a0, a1, a2)); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['Pb'])(a0, a1)); + + var dynCall_iii = (Module['dynCall_iii'] = (a0, a1, a2) => + (dynCall_iii = Module['dynCall_iii'] = wasmExports['Qb'])(a0, a1, a2)); + + var dynCall_ii = (Module['dynCall_ii'] = (a0, a1) => + (dynCall_ii = Module['dynCall_ii'] = wasmExports['Rb'])(a0, a1)); + + var dynCall_v = (Module['dynCall_v'] = (a0) => + (dynCall_v = Module['dynCall_v'] = wasmExports['Sb'])(a0)); + + var dynCall_iiii = (Module['dynCall_iiii'] = (a0, a1, a2, a3) => + (dynCall_iiii = Module['dynCall_iiii'] = wasmExports['Tb'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_iiiii = (Module['dynCall_iiiii'] = (a0, a1, a2, a3, a4) => + (dynCall_iiiii = Module['dynCall_iiiii'] = wasmExports['Ub'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iiiiii = (Module['dynCall_iiiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_iiiiii = Module['dynCall_iiiiii'] = wasmExports['Vb'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_viiii = (Module['dynCall_viiii'] = (a0, a1, a2, a3, a4) => + (dynCall_viiii = Module['dynCall_viiii'] = wasmExports['Wb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_viiiii = (Module['dynCall_viiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viiiii = Module['dynCall_viiiii'] = wasmExports['Xb'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_iiiiiii = (Module['dynCall_iiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_iiiiiii = Module['dynCall_iiiiiii'] = wasmExports['Yb'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_i = (Module['dynCall_i'] = (a0) => + (dynCall_i = Module['dynCall_i'] = wasmExports['Zb'])(a0)); + + var dynCall_viiiiiiiii = (Module['dynCall_viiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_viiiiiiiii = Module['dynCall_viiiiiiiii'] = wasmExports['_b'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_viiiiii = (Module['dynCall_viiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_viiiiii = Module['dynCall_viiiiii'] = wasmExports['$b'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_iiiiiiii = (Module['dynCall_iiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_iiiiiiii = Module['dynCall_iiiiiiii'] = wasmExports['ac'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_iiiiiiiiii = (Module['dynCall_iiiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_iiiiiiiiii = Module['dynCall_iiiiiiiiii'] = wasmExports['bc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_jii = (Module['dynCall_jii'] = (a0, a1, a2) => + (dynCall_jii = Module['dynCall_jii'] = wasmExports['cc'])(a0, a1, a2)); + + var _asyncify_start_unwind = (a0) => + (_asyncify_start_unwind = wasmExports['dc'])(a0); + + var _asyncify_stop_unwind = () => + (_asyncify_stop_unwind = wasmExports['ec'])(); + + var _asyncify_start_rewind = (a0) => + (_asyncify_start_rewind = wasmExports['fc'])(a0); + + var _asyncify_stop_rewind = () => + (_asyncify_stop_rewind = wasmExports['gc'])(); + + function invoke_viii(index, a1, a2, a3) { + var sp = stackSave(); + try { + dynCall_viii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vii(index, a1, a2) { + var sp = stackSave(); + try { + dynCall_vii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vi(index, a1) { + var sp = stackSave(); + try { + dynCall_vi(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_iii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_v(index) { + var sp = stackSave(); + try { + dynCall_v(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_ii(index, a1) { + var sp = stackSave(); + try { + return dynCall_ii(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_i(index) { + var sp = stackSave(); + try { + return dynCall_i(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + dynCall_viiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + return dynCall_iiiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiii(index, a1, a2, a3) { + var sp = stackSave(); + try { + return dynCall_iiii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + return dynCall_iiiiiiiiii( + index, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + return dynCall_iiiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_jii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_jii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/asyncify/php_7_2.js b/packages/php-wasm/node/asyncify/php_7_2.js index 09844d013c..6e4fdab48c 100644 --- a/packages/php-wasm/node/asyncify/php_7_2.js +++ b/packages/php-wasm/node/asyncify/php_7_2.js @@ -1,6605 +1,7648 @@ -const dependencyFilename = __dirname + '/7_2_34/php_7_2.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 14137039; +const dependencyFilename = __dirname + '/7_2_34/php_7_2.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 14137039; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - return { - "a": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["Ya"]; - updateMemoryViews(); - wasmTable = wasmExports["ab"]; - addOnInit(wasmExports["Za"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function js_popen_to_file(command, mode, exitCodePtr) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); -} - -function wasm_poll_socket(socketd, events, timeout) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); -} - -function js_fd_read(fd, iov, iovcnt, pnum) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); -} - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var stackRestore = val => __emscripten_stack_restore(val); - -var stackSave = () => _emscripten_stack_get_current(); - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -var __emscripten_throw_longjmp = () => { - throw Infinity; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + return { + a: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['Ya']; + updateMemoryViews(); + wasmTable = wasmExports['ab']; + addOnInit(wasmExports['Za']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function js_popen_to_file(command, mode, exitCodePtr) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce((acc, curr) => acc + curr.length, 0) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + } + + function wasm_poll_socket(socketd, events, timeout) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + } + + function js_fd_read(fd, iov, iovcnt, pnum) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + } + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + var __emscripten_throw_longjmp = () => { + throw Infinity; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6610,889 +7653,1186 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -/** @type {WebAssembly.Table} */ var wasmTable; - -var runAndAbortIfError = func => { - try { - return func(); - } catch (e) { - abort(e); - } -}; - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - } - } - }, - instrumentWasmExports(exports) { - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - ret[x] = (...args) => { - Asyncify.exportCallStack.push(x); - try { - return original(...args); - } finally { - if (!ABORT) { - var y = Asyncify.exportCallStack.pop(); - Asyncify.maybeStopUnwind(); - } - } - }; - } else { - ret[x] = original; - } - } - return ret; - }, - State: { - Normal: 0, - Unwinding: 1, - Rewinding: 2, - Disabled: 3 - }, - state: 0, - StackSize: 4096, - currData: null, - handleSleepReturnValue: 0, - exportCallStack: [], - callStackNameToId: {}, - callStackIdToName: {}, - callStackId: 0, - asyncPromiseHandlers: null, - sleepCallbacks: [], - getCallStackId(funcName) { - var id = Asyncify.callStackNameToId[funcName]; - if (id === undefined) { - id = Asyncify.callStackId++; - Asyncify.callStackNameToId[funcName] = id; - Asyncify.callStackIdToName[id] = funcName; - } - return id; - }, - maybeStopUnwind() { - if (Asyncify.currData && Asyncify.state === Asyncify.State.Unwinding && Asyncify.exportCallStack.length === 0) { - Asyncify.state = Asyncify.State.Normal; - runtimeKeepalivePush(); - runAndAbortIfError(_asyncify_stop_unwind); - if (typeof Fibers != "undefined") { - Fibers.trampoline(); - } - } - }, - whenDone() { - return new Promise((resolve, reject) => { - Asyncify.asyncPromiseHandlers = { - resolve: resolve, - reject: 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)] = stack; - HEAPU32[(((ptr) + (4)) >> 2)] = stack + stackSize; - }, - setDataRewindFunc(ptr) { - var bottomOfCallStack = Asyncify.exportCallStack[0]; - var rewindId = Asyncify.getCallStackId(bottomOfCallStack); - HEAP32[(((ptr) + (8)) >> 2)] = rewindId; - }, - getDataRewindFuncName(ptr) { - var id = HEAP32[(((ptr) + (8)) >> 2)]; - var name = Asyncify.callStackIdToName[id]; - return name; - }, - getDataRewindFunc(name) { - var func = wasmExports[name]; - return func; - }, - doRewind(ptr) { - var name = Asyncify.getDataRewindFuncName(ptr); - var func = Asyncify.getDataRewindFunc(name); - runtimeKeepalivePop(); - return 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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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) { - return Asyncify.handleSleep(wakeUp => { - startAsync().then(wakeUp); - }); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var previousAsync = Asyncify.currData; - var ret = func(...cArgs); - function onDone(ret) { - runtimeKeepalivePop(); - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - runtimeKeepalivePush(); - if (Asyncify.currData != previousAsync) { - return Asyncify.whenDone().then(onDone); - } - ret = onDone(ret); - if (asyncMode) return Promise.resolve(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ n: ___assert_fail, - /** @export */ W: __asyncjs__js_module_onMessage, - /** @export */ Xa: ___call_sighandler, - /** @export */ Wa: ___syscall_accept4, - /** @export */ Va: ___syscall_bind, - /** @export */ Ua: ___syscall_chdir, - /** @export */ P: ___syscall_chmod, - /** @export */ Ta: ___syscall_connect, - /** @export */ Sa: ___syscall_dup, - /** @export */ Ra: ___syscall_dup3, - /** @export */ Qa: ___syscall_faccessat, - /** @export */ Pa: ___syscall_fchmod, - /** @export */ Oa: ___syscall_fchown32, - /** @export */ O: ___syscall_fchownat, - /** @export */ l: ___syscall_fcntl64, - /** @export */ Na: ___syscall_fstat64, - /** @export */ ba: ___syscall_ftruncate64, - /** @export */ Ma: ___syscall_getcwd, - /** @export */ La: ___syscall_getdents64, - /** @export */ Ka: ___syscall_getpeername, - /** @export */ Ja: ___syscall_getsockname, - /** @export */ Ia: ___syscall_getsockopt, - /** @export */ E: ___syscall_ioctl, - /** @export */ Ha: ___syscall_listen, - /** @export */ Ga: ___syscall_lstat64, - /** @export */ Fa: ___syscall_mkdirat, - /** @export */ Ea: ___syscall_newfstatat, - /** @export */ x: ___syscall_openat, - /** @export */ Da: ___syscall_pipe, - /** @export */ Ca: ___syscall_poll, - /** @export */ Ba: ___syscall_readlinkat, - /** @export */ Aa: ___syscall_recvfrom, - /** @export */ za: ___syscall_renameat, - /** @export */ N: ___syscall_rmdir, - /** @export */ ya: ___syscall_sendto, - /** @export */ M: ___syscall_socket, - /** @export */ xa: ___syscall_stat64, - /** @export */ wa: ___syscall_statfs64, - /** @export */ va: ___syscall_symlink, - /** @export */ D: ___syscall_unlinkat, - /** @export */ ua: ___syscall_utimensat, - /** @export */ pa: __abort_js, - /** @export */ oa: __emscripten_get_now_is_monotonic, - /** @export */ na: __emscripten_lookup_name, - /** @export */ ma: __emscripten_memcpy_js, - /** @export */ la: __emscripten_runtime_keepalive_clear, - /** @export */ ka: __emscripten_throw_longjmp, - /** @export */ fa: __gmtime_js, - /** @export */ ga: __localtime_js, - /** @export */ $: __mktime_js, - /** @export */ da: __mmap_js, - /** @export */ ea: __munmap_js, - /** @export */ J: __setitimer_js, - /** @export */ ja: __tzset_js, - /** @export */ B: _emscripten_date_now, - /** @export */ ia: _emscripten_get_heap_max, - /** @export */ v: _emscripten_get_now, - /** @export */ ha: _emscripten_resize_heap, - /** @export */ I: _emscripten_sleep, - /** @export */ ta: _environ_get, - /** @export */ sa: _environ_sizes_get, - /** @export */ p: _exit, - /** @export */ r: _fd_close, - /** @export */ L: _fd_fdstat_get, - /** @export */ K: _fd_read, - /** @export */ aa: _fd_seek, - /** @export */ ra: _fd_sync, - /** @export */ C: _fd_write, - /** @export */ _: _getaddrinfo, - /** @export */ H: _getnameinfo, - /** @export */ Z: _getprotobyname, - /** @export */ Y: _getprotobynumber, - /** @export */ i: invoke_i, - /** @export */ c: invoke_ii, - /** @export */ b: invoke_iii, - /** @export */ f: invoke_iiii, - /** @export */ g: invoke_iiiii, - /** @export */ q: invoke_iiiiii, - /** @export */ u: invoke_iiiiiii, - /** @export */ w: invoke_iiiiiiii, - /** @export */ A: invoke_iiiiiiiiii, - /** @export */ ca: invoke_jii, - /** @export */ e: invoke_v, - /** @export */ a: invoke_vi, - /** @export */ d: invoke_vii, - /** @export */ z: invoke_viidii, - /** @export */ h: invoke_viii, - /** @export */ k: invoke_viiii, - /** @export */ m: invoke_viiiii, - /** @export */ j: invoke_viiiiii, - /** @export */ y: invoke_viiiiiiiii, - /** @export */ G: _js_create_input_device, - /** @export */ X: js_fd_read, - /** @export */ F: _js_open_process, - /** @export */ V: js_popen_to_file, - /** @export */ U: _js_process_status, - /** @export */ T: _js_waitpid, - /** @export */ qa: _proc_exit, - /** @export */ S: _strftime, - /** @export */ R: _strftime_l, - /** @export */ Q: _strptime, - /** @export */ s: _wasm_close, - /** @export */ t: wasm_poll_socket, - /** @export */ o: _wasm_setsockopt -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["Za"])(); - -var _malloc = a0 => (_malloc = wasmExports["_a"])(a0); - -var _free = a0 => (_free = wasmExports["$a"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["bb"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["cb"])(a0); - -var _htons = a0 => (_htons = wasmExports["db"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["eb"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["fb"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["gb"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["hb"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["ib"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["jb"])(a0, a1, a2); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["kb"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["lb"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["mb"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["nb"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["ob"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["pb"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["qb"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["rb"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["sb"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["tb"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["ub"])(a0); - -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["vb"])(a0); - -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["wb"])(a0); - -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["xb"])(a0); - -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["yb"])(a0); - -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["zb"])(a0); - -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["Ab"])(a0); - -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["Bb"])(a0); - -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["Cb"])(); - -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["Db"])(); - -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["Eb"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["Fb"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["Gb"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["Hb"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["Ib"])(a0, a1); - -var _setThrew = (a0, a1) => (_setThrew = wasmExports["Jb"])(a0, a1); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["Kb"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["Lb"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["Mb"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["Nb"])(); - -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["Ob"])(a0, a1); - -var dynCall_iiii = Module["dynCall_iiii"] = (a0, a1, a2, a3) => (dynCall_iiii = Module["dynCall_iiii"] = wasmExports["Pb"])(a0, a1, a2, a3); - -var dynCall_ii = Module["dynCall_ii"] = (a0, a1) => (dynCall_ii = Module["dynCall_ii"] = wasmExports["Qb"])(a0, a1); - -var dynCall_vii = Module["dynCall_vii"] = (a0, a1, a2) => (dynCall_vii = Module["dynCall_vii"] = wasmExports["Rb"])(a0, a1, a2); - -var dynCall_viiiii = Module["dynCall_viiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viiiii = Module["dynCall_viiiii"] = wasmExports["Sb"])(a0, a1, a2, a3, a4, a5); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + /** @type {WebAssembly.Table} */ var wasmTable; + + var runAndAbortIfError = (func) => { + try { + return func(); + } catch (e) { + abort(e); + } + }; + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + } + } + }, + instrumentWasmExports(exports) { + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + ret[x] = (...args) => { + Asyncify.exportCallStack.push(x); + try { + return original(...args); + } finally { + if (!ABORT) { + var y = Asyncify.exportCallStack.pop(); + Asyncify.maybeStopUnwind(); + } + } + }; + } else { + ret[x] = original; + } + } + return ret; + }, + State: { + Normal: 0, + Unwinding: 1, + Rewinding: 2, + Disabled: 3, + }, + state: 0, + StackSize: 4096, + currData: null, + handleSleepReturnValue: 0, + exportCallStack: [], + callStackNameToId: {}, + callStackIdToName: {}, + callStackId: 0, + asyncPromiseHandlers: null, + sleepCallbacks: [], + getCallStackId(funcName) { + var id = Asyncify.callStackNameToId[funcName]; + if (id === undefined) { + id = Asyncify.callStackId++; + Asyncify.callStackNameToId[funcName] = id; + Asyncify.callStackIdToName[id] = funcName; + } + return id; + }, + maybeStopUnwind() { + if ( + Asyncify.currData && + Asyncify.state === Asyncify.State.Unwinding && + Asyncify.exportCallStack.length === 0 + ) { + Asyncify.state = Asyncify.State.Normal; + runtimeKeepalivePush(); + runAndAbortIfError(_asyncify_stop_unwind); + if (typeof Fibers != 'undefined') { + Fibers.trampoline(); + } + } + }, + whenDone() { + return new Promise((resolve, reject) => { + Asyncify.asyncPromiseHandlers = { + resolve: resolve, + reject: 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] = stack; + HEAPU32[(ptr + 4) >> 2] = stack + stackSize; + }, + setDataRewindFunc(ptr) { + var bottomOfCallStack = Asyncify.exportCallStack[0]; + var rewindId = Asyncify.getCallStackId(bottomOfCallStack); + HEAP32[(ptr + 8) >> 2] = rewindId; + }, + getDataRewindFuncName(ptr) { + var id = HEAP32[(ptr + 8) >> 2]; + var name = Asyncify.callStackIdToName[id]; + return name; + }, + getDataRewindFunc(name) { + var func = wasmExports[name]; + return func; + }, + doRewind(ptr) { + var name = Asyncify.getDataRewindFuncName(ptr); + var func = Asyncify.getDataRewindFunc(name); + runtimeKeepalivePop(); + return 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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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) { + return Asyncify.handleSleep((wakeUp) => { + startAsync().then(wakeUp); + }); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var previousAsync = Asyncify.currData; + var ret = func(...cArgs); + function onDone(ret) { + runtimeKeepalivePop(); + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + runtimeKeepalivePush(); + if (Asyncify.currData != previousAsync) { + return Asyncify.whenDone().then(onDone); + } + ret = onDone(ret); + if (asyncMode) return Promise.resolve(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ n: ___assert_fail, + /** @export */ W: __asyncjs__js_module_onMessage, + /** @export */ Xa: ___call_sighandler, + /** @export */ Wa: ___syscall_accept4, + /** @export */ Va: ___syscall_bind, + /** @export */ Ua: ___syscall_chdir, + /** @export */ P: ___syscall_chmod, + /** @export */ Ta: ___syscall_connect, + /** @export */ Sa: ___syscall_dup, + /** @export */ Ra: ___syscall_dup3, + /** @export */ Qa: ___syscall_faccessat, + /** @export */ Pa: ___syscall_fchmod, + /** @export */ Oa: ___syscall_fchown32, + /** @export */ O: ___syscall_fchownat, + /** @export */ l: ___syscall_fcntl64, + /** @export */ Na: ___syscall_fstat64, + /** @export */ ba: ___syscall_ftruncate64, + /** @export */ Ma: ___syscall_getcwd, + /** @export */ La: ___syscall_getdents64, + /** @export */ Ka: ___syscall_getpeername, + /** @export */ Ja: ___syscall_getsockname, + /** @export */ Ia: ___syscall_getsockopt, + /** @export */ E: ___syscall_ioctl, + /** @export */ Ha: ___syscall_listen, + /** @export */ Ga: ___syscall_lstat64, + /** @export */ Fa: ___syscall_mkdirat, + /** @export */ Ea: ___syscall_newfstatat, + /** @export */ x: ___syscall_openat, + /** @export */ Da: ___syscall_pipe, + /** @export */ Ca: ___syscall_poll, + /** @export */ Ba: ___syscall_readlinkat, + /** @export */ Aa: ___syscall_recvfrom, + /** @export */ za: ___syscall_renameat, + /** @export */ N: ___syscall_rmdir, + /** @export */ ya: ___syscall_sendto, + /** @export */ M: ___syscall_socket, + /** @export */ xa: ___syscall_stat64, + /** @export */ wa: ___syscall_statfs64, + /** @export */ va: ___syscall_symlink, + /** @export */ D: ___syscall_unlinkat, + /** @export */ ua: ___syscall_utimensat, + /** @export */ pa: __abort_js, + /** @export */ oa: __emscripten_get_now_is_monotonic, + /** @export */ na: __emscripten_lookup_name, + /** @export */ ma: __emscripten_memcpy_js, + /** @export */ la: __emscripten_runtime_keepalive_clear, + /** @export */ ka: __emscripten_throw_longjmp, + /** @export */ fa: __gmtime_js, + /** @export */ ga: __localtime_js, + /** @export */ $: __mktime_js, + /** @export */ da: __mmap_js, + /** @export */ ea: __munmap_js, + /** @export */ J: __setitimer_js, + /** @export */ ja: __tzset_js, + /** @export */ B: _emscripten_date_now, + /** @export */ ia: _emscripten_get_heap_max, + /** @export */ v: _emscripten_get_now, + /** @export */ ha: _emscripten_resize_heap, + /** @export */ I: _emscripten_sleep, + /** @export */ ta: _environ_get, + /** @export */ sa: _environ_sizes_get, + /** @export */ p: _exit, + /** @export */ r: _fd_close, + /** @export */ L: _fd_fdstat_get, + /** @export */ K: _fd_read, + /** @export */ aa: _fd_seek, + /** @export */ ra: _fd_sync, + /** @export */ C: _fd_write, + /** @export */ _: _getaddrinfo, + /** @export */ H: _getnameinfo, + /** @export */ Z: _getprotobyname, + /** @export */ Y: _getprotobynumber, + /** @export */ i: invoke_i, + /** @export */ c: invoke_ii, + /** @export */ b: invoke_iii, + /** @export */ f: invoke_iiii, + /** @export */ g: invoke_iiiii, + /** @export */ q: invoke_iiiiii, + /** @export */ u: invoke_iiiiiii, + /** @export */ w: invoke_iiiiiiii, + /** @export */ A: invoke_iiiiiiiiii, + /** @export */ ca: invoke_jii, + /** @export */ e: invoke_v, + /** @export */ a: invoke_vi, + /** @export */ d: invoke_vii, + /** @export */ z: invoke_viidii, + /** @export */ h: invoke_viii, + /** @export */ k: invoke_viiii, + /** @export */ m: invoke_viiiii, + /** @export */ j: invoke_viiiiii, + /** @export */ y: invoke_viiiiiiiii, + /** @export */ G: _js_create_input_device, + /** @export */ X: js_fd_read, + /** @export */ F: _js_open_process, + /** @export */ V: js_popen_to_file, + /** @export */ U: _js_process_status, + /** @export */ T: _js_waitpid, + /** @export */ qa: _proc_exit, + /** @export */ S: _strftime, + /** @export */ R: _strftime_l, + /** @export */ Q: _strptime, + /** @export */ s: _wasm_close, + /** @export */ t: wasm_poll_socket, + /** @export */ o: _wasm_setsockopt, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports['Za'])(); + + var _malloc = (a0) => (_malloc = wasmExports['_a'])(a0); + + var _free = (a0) => (_free = wasmExports['$a'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['bb'])(a0)); + + var _ntohs = (a0) => (_ntohs = wasmExports['cb'])(a0); + + var _htons = (a0) => (_htons = wasmExports['db'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['eb'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['fb'])(a0, a1, a2)); + + var _fflush = (a0) => (_fflush = wasmExports['gb'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['hb'])(a0, a1)); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = wasmExports['ib'])( + a0, + a1, + a2, + a3 + )); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = wasmExports['jb'])( + a0, + a1, + a2 + )); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = wasmExports['kb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = wasmExports['lb'])( + a0 + )); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['mb'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['nb'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['ob'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['pb'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['qb'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['rb'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['sb'])(a0)); + + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['tb'])(a0)); + + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['ub'])(a0)); -var dynCall_iii = Module["dynCall_iii"] = (a0, a1, a2) => (dynCall_iii = Module["dynCall_iii"] = wasmExports["Tb"])(a0, a1, a2); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['vb'])(a0)); -var dynCall_iiiii = Module["dynCall_iiiii"] = (a0, a1, a2, a3, a4) => (dynCall_iiiii = Module["dynCall_iiiii"] = wasmExports["Ub"])(a0, a1, a2, a3, a4); - -var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_iiiiiii = Module["dynCall_iiiiiii"] = wasmExports["Vb"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_iiiiii = Module["dynCall_iiiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_iiiiii = Module["dynCall_iiiiii"] = wasmExports["Wb"])(a0, a1, a2, a3, a4, a5); - -var dynCall_i = Module["dynCall_i"] = a0 => (dynCall_i = Module["dynCall_i"] = wasmExports["Xb"])(a0); - -var dynCall_viii = Module["dynCall_viii"] = (a0, a1, a2, a3) => (dynCall_viii = Module["dynCall_viii"] = wasmExports["Yb"])(a0, a1, a2, a3); - -var dynCall_viiii = Module["dynCall_viiii"] = (a0, a1, a2, a3, a4) => (dynCall_viiii = Module["dynCall_viiii"] = wasmExports["Zb"])(a0, a1, a2, a3, a4); - -var dynCall_v = Module["dynCall_v"] = a0 => (dynCall_v = Module["dynCall_v"] = wasmExports["_b"])(a0); - -var dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = wasmExports["$b"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_viiiiii = Module["dynCall_viiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_viiiiii = Module["dynCall_viiiiii"] = wasmExports["ac"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = wasmExports["bc"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = wasmExports["cc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_jii = Module["dynCall_jii"] = (a0, a1, a2) => (dynCall_jii = Module["dynCall_jii"] = wasmExports["dc"])(a0, a1, a2); - -var dynCall_viidii = Module["dynCall_viidii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viidii = Module["dynCall_viidii"] = wasmExports["ec"])(a0, a1, a2, a3, a4, a5); - -var _asyncify_start_unwind = a0 => (_asyncify_start_unwind = wasmExports["fc"])(a0); - -var _asyncify_stop_unwind = () => (_asyncify_stop_unwind = wasmExports["gc"])(); - -var _asyncify_start_rewind = a0 => (_asyncify_start_rewind = wasmExports["hc"])(a0); - -var _asyncify_stop_rewind = () => (_asyncify_stop_rewind = wasmExports["ic"])(); - -function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vi(index, a1) { - var sp = stackSave(); - try { - dynCall_vi(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vii(index, a1, a2) { - var sp = stackSave(); - try { - dynCall_vii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_iii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_i(index) { - var sp = stackSave(); - try { - return dynCall_i(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_v(index) { - var sp = stackSave(); - try { - dynCall_v(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viii(index, a1, a2, a3) { - var sp = stackSave(); - try { - dynCall_viii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_ii(index, a1) { - var sp = stackSave(); - try { - return dynCall_ii(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - dynCall_viiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - return dynCall_iiiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiii(index, a1, a2, a3) { - var sp = stackSave(); - try { - return dynCall_iiii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viidii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viidii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - return dynCall_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - return dynCall_iiiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_jii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_jii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['wb'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['xb'])(a0)); + + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['yb'])(a0)); + + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['zb'])(a0)); + + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = wasmExports['Ab'])( + a0 + )); + + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['Bb'])(a0)); + + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['Cb'])()); + + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['Db'])()); + + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = wasmExports['Eb'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['Fb'])(a0)); + + var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports['Gb'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = wasmExports['Hb'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['Ib'])(a0, a1); + + var _setThrew = (a0, a1) => (_setThrew = wasmExports['Jb'])(a0, a1); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['Kb'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['Lb'])(a0); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['Mb'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = wasmExports['Nb'])(); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['Ob'])(a0, a1)); + + var dynCall_iiii = (Module['dynCall_iiii'] = (a0, a1, a2, a3) => + (dynCall_iiii = Module['dynCall_iiii'] = wasmExports['Pb'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_ii = (Module['dynCall_ii'] = (a0, a1) => + (dynCall_ii = Module['dynCall_ii'] = wasmExports['Qb'])(a0, a1)); + + var dynCall_vii = (Module['dynCall_vii'] = (a0, a1, a2) => + (dynCall_vii = Module['dynCall_vii'] = wasmExports['Rb'])(a0, a1, a2)); + + var dynCall_viiiii = (Module['dynCall_viiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viiiii = Module['dynCall_viiiii'] = wasmExports['Sb'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_iii = (Module['dynCall_iii'] = (a0, a1, a2) => + (dynCall_iii = Module['dynCall_iii'] = wasmExports['Tb'])(a0, a1, a2)); + + var dynCall_iiiii = (Module['dynCall_iiiii'] = (a0, a1, a2, a3, a4) => + (dynCall_iiiii = Module['dynCall_iiiii'] = wasmExports['Ub'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iiiiiii = (Module['dynCall_iiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_iiiiiii = Module['dynCall_iiiiiii'] = wasmExports['Vb'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_iiiiii = (Module['dynCall_iiiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_iiiiii = Module['dynCall_iiiiii'] = wasmExports['Wb'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_i = (Module['dynCall_i'] = (a0) => + (dynCall_i = Module['dynCall_i'] = wasmExports['Xb'])(a0)); + + var dynCall_viii = (Module['dynCall_viii'] = (a0, a1, a2, a3) => + (dynCall_viii = Module['dynCall_viii'] = wasmExports['Yb'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_viiii = (Module['dynCall_viiii'] = (a0, a1, a2, a3, a4) => + (dynCall_viiii = Module['dynCall_viiii'] = wasmExports['Zb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_v = (Module['dynCall_v'] = (a0) => + (dynCall_v = Module['dynCall_v'] = wasmExports['_b'])(a0)); + + var dynCall_viiiiiiiii = (Module['dynCall_viiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_viiiiiiiii = Module['dynCall_viiiiiiiii'] = wasmExports['$b'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_viiiiii = (Module['dynCall_viiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_viiiiii = Module['dynCall_viiiiii'] = wasmExports['ac'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_iiiiiiii = (Module['dynCall_iiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_iiiiiiii = Module['dynCall_iiiiiiii'] = wasmExports['bc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_iiiiiiiiii = (Module['dynCall_iiiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_iiiiiiiiii = Module['dynCall_iiiiiiiiii'] = wasmExports['cc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_jii = (Module['dynCall_jii'] = (a0, a1, a2) => + (dynCall_jii = Module['dynCall_jii'] = wasmExports['dc'])(a0, a1, a2)); + + var dynCall_viidii = (Module['dynCall_viidii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viidii = Module['dynCall_viidii'] = wasmExports['ec'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var _asyncify_start_unwind = (a0) => + (_asyncify_start_unwind = wasmExports['fc'])(a0); + + var _asyncify_stop_unwind = () => + (_asyncify_stop_unwind = wasmExports['gc'])(); + + var _asyncify_start_rewind = (a0) => + (_asyncify_start_rewind = wasmExports['hc'])(a0); + + var _asyncify_stop_rewind = () => + (_asyncify_stop_rewind = wasmExports['ic'])(); + + function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vi(index, a1) { + var sp = stackSave(); + try { + dynCall_vi(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vii(index, a1, a2) { + var sp = stackSave(); + try { + dynCall_vii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_iii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_i(index) { + var sp = stackSave(); + try { + return dynCall_i(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_v(index) { + var sp = stackSave(); + try { + dynCall_v(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viii(index, a1, a2, a3) { + var sp = stackSave(); + try { + dynCall_viii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_ii(index, a1) { + var sp = stackSave(); + try { + return dynCall_ii(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + dynCall_viiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + return dynCall_iiiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiii(index, a1, a2, a3) { + var sp = stackSave(); + try { + return dynCall_iiii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viidii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viidii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + return dynCall_iiiiiiiiii( + index, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + return dynCall_iiiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_jii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_jii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/asyncify/php_7_3.js b/packages/php-wasm/node/asyncify/php_7_3.js index 7054aac783..ad96c3965e 100644 --- a/packages/php-wasm/node/asyncify/php_7_3.js +++ b/packages/php-wasm/node/asyncify/php_7_3.js @@ -1,6605 +1,7648 @@ -const dependencyFilename = __dirname + '/7_3_33/php_7_3.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 14262166; +const dependencyFilename = __dirname + '/7_3_33/php_7_3.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 14262166; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - return { - "a": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["Ya"]; - updateMemoryViews(); - wasmTable = wasmExports["ab"]; - addOnInit(wasmExports["Za"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function js_popen_to_file(command, mode, exitCodePtr) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); -} - -function wasm_poll_socket(socketd, events, timeout) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); -} - -function js_fd_read(fd, iov, iovcnt, pnum) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); -} - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var stackRestore = val => __emscripten_stack_restore(val); - -var stackSave = () => _emscripten_stack_get_current(); - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -var __emscripten_throw_longjmp = () => { - throw Infinity; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + return { + a: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['Ya']; + updateMemoryViews(); + wasmTable = wasmExports['ab']; + addOnInit(wasmExports['Za']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function js_popen_to_file(command, mode, exitCodePtr) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce((acc, curr) => acc + curr.length, 0) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + } + + function wasm_poll_socket(socketd, events, timeout) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + } + + function js_fd_read(fd, iov, iovcnt, pnum) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + } + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + var __emscripten_throw_longjmp = () => { + throw Infinity; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6610,889 +7653,1186 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -/** @type {WebAssembly.Table} */ var wasmTable; - -var runAndAbortIfError = func => { - try { - return func(); - } catch (e) { - abort(e); - } -}; - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - } - } - }, - instrumentWasmExports(exports) { - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - ret[x] = (...args) => { - Asyncify.exportCallStack.push(x); - try { - return original(...args); - } finally { - if (!ABORT) { - var y = Asyncify.exportCallStack.pop(); - Asyncify.maybeStopUnwind(); - } - } - }; - } else { - ret[x] = original; - } - } - return ret; - }, - State: { - Normal: 0, - Unwinding: 1, - Rewinding: 2, - Disabled: 3 - }, - state: 0, - StackSize: 4096, - currData: null, - handleSleepReturnValue: 0, - exportCallStack: [], - callStackNameToId: {}, - callStackIdToName: {}, - callStackId: 0, - asyncPromiseHandlers: null, - sleepCallbacks: [], - getCallStackId(funcName) { - var id = Asyncify.callStackNameToId[funcName]; - if (id === undefined) { - id = Asyncify.callStackId++; - Asyncify.callStackNameToId[funcName] = id; - Asyncify.callStackIdToName[id] = funcName; - } - return id; - }, - maybeStopUnwind() { - if (Asyncify.currData && Asyncify.state === Asyncify.State.Unwinding && Asyncify.exportCallStack.length === 0) { - Asyncify.state = Asyncify.State.Normal; - runtimeKeepalivePush(); - runAndAbortIfError(_asyncify_stop_unwind); - if (typeof Fibers != "undefined") { - Fibers.trampoline(); - } - } - }, - whenDone() { - return new Promise((resolve, reject) => { - Asyncify.asyncPromiseHandlers = { - resolve: resolve, - reject: 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)] = stack; - HEAPU32[(((ptr) + (4)) >> 2)] = stack + stackSize; - }, - setDataRewindFunc(ptr) { - var bottomOfCallStack = Asyncify.exportCallStack[0]; - var rewindId = Asyncify.getCallStackId(bottomOfCallStack); - HEAP32[(((ptr) + (8)) >> 2)] = rewindId; - }, - getDataRewindFuncName(ptr) { - var id = HEAP32[(((ptr) + (8)) >> 2)]; - var name = Asyncify.callStackIdToName[id]; - return name; - }, - getDataRewindFunc(name) { - var func = wasmExports[name]; - return func; - }, - doRewind(ptr) { - var name = Asyncify.getDataRewindFuncName(ptr); - var func = Asyncify.getDataRewindFunc(name); - runtimeKeepalivePop(); - return 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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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) { - return Asyncify.handleSleep(wakeUp => { - startAsync().then(wakeUp); - }); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var previousAsync = Asyncify.currData; - var ret = func(...cArgs); - function onDone(ret) { - runtimeKeepalivePop(); - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - runtimeKeepalivePush(); - if (Asyncify.currData != previousAsync) { - return Asyncify.whenDone().then(onDone); - } - ret = onDone(ret); - if (asyncMode) return Promise.resolve(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ n: ___assert_fail, - /** @export */ X: __asyncjs__js_module_onMessage, - /** @export */ Xa: ___call_sighandler, - /** @export */ Wa: ___syscall_accept4, - /** @export */ Va: ___syscall_bind, - /** @export */ Ua: ___syscall_chdir, - /** @export */ Q: ___syscall_chmod, - /** @export */ Ta: ___syscall_connect, - /** @export */ Sa: ___syscall_dup, - /** @export */ Ra: ___syscall_dup3, - /** @export */ Qa: ___syscall_faccessat, - /** @export */ Pa: ___syscall_fchmod, - /** @export */ Oa: ___syscall_fchown32, - /** @export */ P: ___syscall_fchownat, - /** @export */ l: ___syscall_fcntl64, - /** @export */ Na: ___syscall_fstat64, - /** @export */ ba: ___syscall_ftruncate64, - /** @export */ Ma: ___syscall_getcwd, - /** @export */ La: ___syscall_getdents64, - /** @export */ Ka: ___syscall_getpeername, - /** @export */ Ja: ___syscall_getsockname, - /** @export */ Ia: ___syscall_getsockopt, - /** @export */ F: ___syscall_ioctl, - /** @export */ Ha: ___syscall_listen, - /** @export */ Ga: ___syscall_lstat64, - /** @export */ Fa: ___syscall_mkdirat, - /** @export */ Ea: ___syscall_newfstatat, - /** @export */ x: ___syscall_openat, - /** @export */ Da: ___syscall_pipe, - /** @export */ Ca: ___syscall_poll, - /** @export */ Ba: ___syscall_readlinkat, - /** @export */ Aa: ___syscall_recvfrom, - /** @export */ za: ___syscall_renameat, - /** @export */ O: ___syscall_rmdir, - /** @export */ ya: ___syscall_sendto, - /** @export */ N: ___syscall_socket, - /** @export */ xa: ___syscall_stat64, - /** @export */ wa: ___syscall_statfs64, - /** @export */ va: ___syscall_symlink, - /** @export */ E: ___syscall_unlinkat, - /** @export */ ua: ___syscall_utimensat, - /** @export */ pa: __abort_js, - /** @export */ oa: __emscripten_get_now_is_monotonic, - /** @export */ na: __emscripten_lookup_name, - /** @export */ ma: __emscripten_memcpy_js, - /** @export */ la: __emscripten_runtime_keepalive_clear, - /** @export */ ka: __emscripten_throw_longjmp, - /** @export */ fa: __gmtime_js, - /** @export */ ga: __localtime_js, - /** @export */ $: __mktime_js, - /** @export */ da: __mmap_js, - /** @export */ ea: __munmap_js, - /** @export */ K: __setitimer_js, - /** @export */ ja: __tzset_js, - /** @export */ C: _emscripten_date_now, - /** @export */ ia: _emscripten_get_heap_max, - /** @export */ v: _emscripten_get_now, - /** @export */ ha: _emscripten_resize_heap, - /** @export */ J: _emscripten_sleep, - /** @export */ ta: _environ_get, - /** @export */ sa: _environ_sizes_get, - /** @export */ p: _exit, - /** @export */ q: _fd_close, - /** @export */ M: _fd_fdstat_get, - /** @export */ L: _fd_read, - /** @export */ aa: _fd_seek, - /** @export */ ra: _fd_sync, - /** @export */ D: _fd_write, - /** @export */ I: _getaddrinfo, - /** @export */ B: _getnameinfo, - /** @export */ _: _getprotobyname, - /** @export */ Z: _getprotobynumber, - /** @export */ i: invoke_i, - /** @export */ d: invoke_ii, - /** @export */ b: invoke_iii, - /** @export */ f: invoke_iiii, - /** @export */ g: invoke_iiiii, - /** @export */ r: invoke_iiiiii, - /** @export */ u: invoke_iiiiiii, - /** @export */ w: invoke_iiiiiiii, - /** @export */ A: invoke_iiiiiiiiii, - /** @export */ ca: invoke_jii, - /** @export */ e: invoke_v, - /** @export */ a: invoke_vi, - /** @export */ c: invoke_vii, - /** @export */ z: invoke_viidii, - /** @export */ h: invoke_viii, - /** @export */ k: invoke_viiii, - /** @export */ m: invoke_viiiii, - /** @export */ j: invoke_viiiiii, - /** @export */ y: invoke_viiiiiiiii, - /** @export */ H: _js_create_input_device, - /** @export */ Y: js_fd_read, - /** @export */ G: _js_open_process, - /** @export */ W: js_popen_to_file, - /** @export */ V: _js_process_status, - /** @export */ U: _js_waitpid, - /** @export */ qa: _proc_exit, - /** @export */ T: _strftime, - /** @export */ S: _strftime_l, - /** @export */ R: _strptime, - /** @export */ s: _wasm_close, - /** @export */ t: wasm_poll_socket, - /** @export */ o: _wasm_setsockopt -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["Za"])(); - -var _malloc = a0 => (_malloc = wasmExports["_a"])(a0); - -var _free = a0 => (_free = wasmExports["$a"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["bb"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["cb"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["db"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["eb"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["fb"])(a0, a1, a2); - -var _htons = a0 => (_htons = wasmExports["gb"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["hb"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["ib"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["jb"])(a0); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["kb"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["lb"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["mb"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["nb"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["ob"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["pb"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["qb"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["rb"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["sb"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["tb"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["ub"])(a0); - -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["vb"])(a0); - -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["wb"])(a0); - -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["xb"])(a0); - -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["yb"])(a0); - -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["zb"])(a0); - -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["Ab"])(a0); - -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["Bb"])(a0); - -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["Cb"])(); - -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["Db"])(); - -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["Eb"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["Fb"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["Gb"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["Hb"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["Ib"])(a0, a1); - -var _setThrew = (a0, a1) => (_setThrew = wasmExports["Jb"])(a0, a1); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["Kb"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["Lb"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["Mb"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["Nb"])(); - -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["Ob"])(a0, a1); - -var dynCall_iiii = Module["dynCall_iiii"] = (a0, a1, a2, a3) => (dynCall_iiii = Module["dynCall_iiii"] = wasmExports["Pb"])(a0, a1, a2, a3); - -var dynCall_ii = Module["dynCall_ii"] = (a0, a1) => (dynCall_ii = Module["dynCall_ii"] = wasmExports["Qb"])(a0, a1); - -var dynCall_vii = Module["dynCall_vii"] = (a0, a1, a2) => (dynCall_vii = Module["dynCall_vii"] = wasmExports["Rb"])(a0, a1, a2); - -var dynCall_iii = Module["dynCall_iii"] = (a0, a1, a2) => (dynCall_iii = Module["dynCall_iii"] = wasmExports["Sb"])(a0, a1, a2); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + /** @type {WebAssembly.Table} */ var wasmTable; + + var runAndAbortIfError = (func) => { + try { + return func(); + } catch (e) { + abort(e); + } + }; + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + } + } + }, + instrumentWasmExports(exports) { + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + ret[x] = (...args) => { + Asyncify.exportCallStack.push(x); + try { + return original(...args); + } finally { + if (!ABORT) { + var y = Asyncify.exportCallStack.pop(); + Asyncify.maybeStopUnwind(); + } + } + }; + } else { + ret[x] = original; + } + } + return ret; + }, + State: { + Normal: 0, + Unwinding: 1, + Rewinding: 2, + Disabled: 3, + }, + state: 0, + StackSize: 4096, + currData: null, + handleSleepReturnValue: 0, + exportCallStack: [], + callStackNameToId: {}, + callStackIdToName: {}, + callStackId: 0, + asyncPromiseHandlers: null, + sleepCallbacks: [], + getCallStackId(funcName) { + var id = Asyncify.callStackNameToId[funcName]; + if (id === undefined) { + id = Asyncify.callStackId++; + Asyncify.callStackNameToId[funcName] = id; + Asyncify.callStackIdToName[id] = funcName; + } + return id; + }, + maybeStopUnwind() { + if ( + Asyncify.currData && + Asyncify.state === Asyncify.State.Unwinding && + Asyncify.exportCallStack.length === 0 + ) { + Asyncify.state = Asyncify.State.Normal; + runtimeKeepalivePush(); + runAndAbortIfError(_asyncify_stop_unwind); + if (typeof Fibers != 'undefined') { + Fibers.trampoline(); + } + } + }, + whenDone() { + return new Promise((resolve, reject) => { + Asyncify.asyncPromiseHandlers = { + resolve: resolve, + reject: 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] = stack; + HEAPU32[(ptr + 4) >> 2] = stack + stackSize; + }, + setDataRewindFunc(ptr) { + var bottomOfCallStack = Asyncify.exportCallStack[0]; + var rewindId = Asyncify.getCallStackId(bottomOfCallStack); + HEAP32[(ptr + 8) >> 2] = rewindId; + }, + getDataRewindFuncName(ptr) { + var id = HEAP32[(ptr + 8) >> 2]; + var name = Asyncify.callStackIdToName[id]; + return name; + }, + getDataRewindFunc(name) { + var func = wasmExports[name]; + return func; + }, + doRewind(ptr) { + var name = Asyncify.getDataRewindFuncName(ptr); + var func = Asyncify.getDataRewindFunc(name); + runtimeKeepalivePop(); + return 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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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) { + return Asyncify.handleSleep((wakeUp) => { + startAsync().then(wakeUp); + }); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var previousAsync = Asyncify.currData; + var ret = func(...cArgs); + function onDone(ret) { + runtimeKeepalivePop(); + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + runtimeKeepalivePush(); + if (Asyncify.currData != previousAsync) { + return Asyncify.whenDone().then(onDone); + } + ret = onDone(ret); + if (asyncMode) return Promise.resolve(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ n: ___assert_fail, + /** @export */ X: __asyncjs__js_module_onMessage, + /** @export */ Xa: ___call_sighandler, + /** @export */ Wa: ___syscall_accept4, + /** @export */ Va: ___syscall_bind, + /** @export */ Ua: ___syscall_chdir, + /** @export */ Q: ___syscall_chmod, + /** @export */ Ta: ___syscall_connect, + /** @export */ Sa: ___syscall_dup, + /** @export */ Ra: ___syscall_dup3, + /** @export */ Qa: ___syscall_faccessat, + /** @export */ Pa: ___syscall_fchmod, + /** @export */ Oa: ___syscall_fchown32, + /** @export */ P: ___syscall_fchownat, + /** @export */ l: ___syscall_fcntl64, + /** @export */ Na: ___syscall_fstat64, + /** @export */ ba: ___syscall_ftruncate64, + /** @export */ Ma: ___syscall_getcwd, + /** @export */ La: ___syscall_getdents64, + /** @export */ Ka: ___syscall_getpeername, + /** @export */ Ja: ___syscall_getsockname, + /** @export */ Ia: ___syscall_getsockopt, + /** @export */ F: ___syscall_ioctl, + /** @export */ Ha: ___syscall_listen, + /** @export */ Ga: ___syscall_lstat64, + /** @export */ Fa: ___syscall_mkdirat, + /** @export */ Ea: ___syscall_newfstatat, + /** @export */ x: ___syscall_openat, + /** @export */ Da: ___syscall_pipe, + /** @export */ Ca: ___syscall_poll, + /** @export */ Ba: ___syscall_readlinkat, + /** @export */ Aa: ___syscall_recvfrom, + /** @export */ za: ___syscall_renameat, + /** @export */ O: ___syscall_rmdir, + /** @export */ ya: ___syscall_sendto, + /** @export */ N: ___syscall_socket, + /** @export */ xa: ___syscall_stat64, + /** @export */ wa: ___syscall_statfs64, + /** @export */ va: ___syscall_symlink, + /** @export */ E: ___syscall_unlinkat, + /** @export */ ua: ___syscall_utimensat, + /** @export */ pa: __abort_js, + /** @export */ oa: __emscripten_get_now_is_monotonic, + /** @export */ na: __emscripten_lookup_name, + /** @export */ ma: __emscripten_memcpy_js, + /** @export */ la: __emscripten_runtime_keepalive_clear, + /** @export */ ka: __emscripten_throw_longjmp, + /** @export */ fa: __gmtime_js, + /** @export */ ga: __localtime_js, + /** @export */ $: __mktime_js, + /** @export */ da: __mmap_js, + /** @export */ ea: __munmap_js, + /** @export */ K: __setitimer_js, + /** @export */ ja: __tzset_js, + /** @export */ C: _emscripten_date_now, + /** @export */ ia: _emscripten_get_heap_max, + /** @export */ v: _emscripten_get_now, + /** @export */ ha: _emscripten_resize_heap, + /** @export */ J: _emscripten_sleep, + /** @export */ ta: _environ_get, + /** @export */ sa: _environ_sizes_get, + /** @export */ p: _exit, + /** @export */ q: _fd_close, + /** @export */ M: _fd_fdstat_get, + /** @export */ L: _fd_read, + /** @export */ aa: _fd_seek, + /** @export */ ra: _fd_sync, + /** @export */ D: _fd_write, + /** @export */ I: _getaddrinfo, + /** @export */ B: _getnameinfo, + /** @export */ _: _getprotobyname, + /** @export */ Z: _getprotobynumber, + /** @export */ i: invoke_i, + /** @export */ d: invoke_ii, + /** @export */ b: invoke_iii, + /** @export */ f: invoke_iiii, + /** @export */ g: invoke_iiiii, + /** @export */ r: invoke_iiiiii, + /** @export */ u: invoke_iiiiiii, + /** @export */ w: invoke_iiiiiiii, + /** @export */ A: invoke_iiiiiiiiii, + /** @export */ ca: invoke_jii, + /** @export */ e: invoke_v, + /** @export */ a: invoke_vi, + /** @export */ c: invoke_vii, + /** @export */ z: invoke_viidii, + /** @export */ h: invoke_viii, + /** @export */ k: invoke_viiii, + /** @export */ m: invoke_viiiii, + /** @export */ j: invoke_viiiiii, + /** @export */ y: invoke_viiiiiiiii, + /** @export */ H: _js_create_input_device, + /** @export */ Y: js_fd_read, + /** @export */ G: _js_open_process, + /** @export */ W: js_popen_to_file, + /** @export */ V: _js_process_status, + /** @export */ U: _js_waitpid, + /** @export */ qa: _proc_exit, + /** @export */ T: _strftime, + /** @export */ S: _strftime_l, + /** @export */ R: _strptime, + /** @export */ s: _wasm_close, + /** @export */ t: wasm_poll_socket, + /** @export */ o: _wasm_setsockopt, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports['Za'])(); + + var _malloc = (a0) => (_malloc = wasmExports['_a'])(a0); + + var _free = (a0) => (_free = wasmExports['$a'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['bb'])(a0, a1, a2)); + + var _fflush = (a0) => (_fflush = wasmExports['cb'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['db'])(a0, a1)); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = wasmExports['eb'])( + a0, + a1, + a2, + a3 + )); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = wasmExports['fb'])( + a0, + a1, + a2 + )); + + var _htons = (a0) => (_htons = wasmExports['gb'])(a0); + + var _ntohs = (a0) => (_ntohs = wasmExports['hb'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['ib'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['jb'])(a0)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = wasmExports['kb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = wasmExports['lb'])( + a0 + )); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['mb'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['nb'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['ob'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['pb'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['qb'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['rb'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['sb'])(a0)); + + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['tb'])(a0)); + + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['ub'])(a0)); -var dynCall_iiiii = Module["dynCall_iiiii"] = (a0, a1, a2, a3, a4) => (dynCall_iiiii = Module["dynCall_iiiii"] = wasmExports["Tb"])(a0, a1, a2, a3, a4); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['vb'])(a0)); -var dynCall_iiiiii = Module["dynCall_iiiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_iiiiii = Module["dynCall_iiiiii"] = wasmExports["Ub"])(a0, a1, a2, a3, a4, a5); - -var dynCall_viiii = Module["dynCall_viiii"] = (a0, a1, a2, a3, a4) => (dynCall_viiii = Module["dynCall_viiii"] = wasmExports["Vb"])(a0, a1, a2, a3, a4); - -var dynCall_viii = Module["dynCall_viii"] = (a0, a1, a2, a3) => (dynCall_viii = Module["dynCall_viii"] = wasmExports["Wb"])(a0, a1, a2, a3); - -var dynCall_viiiii = Module["dynCall_viiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viiiii = Module["dynCall_viiiii"] = wasmExports["Xb"])(a0, a1, a2, a3, a4, a5); - -var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_iiiiiii = Module["dynCall_iiiiiii"] = wasmExports["Yb"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_i = Module["dynCall_i"] = a0 => (dynCall_i = Module["dynCall_i"] = wasmExports["Zb"])(a0); - -var dynCall_v = Module["dynCall_v"] = a0 => (dynCall_v = Module["dynCall_v"] = wasmExports["_b"])(a0); - -var dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = wasmExports["$b"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_viiiiii = Module["dynCall_viiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_viiiiii = Module["dynCall_viiiiii"] = wasmExports["ac"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = wasmExports["bc"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = wasmExports["cc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_jii = Module["dynCall_jii"] = (a0, a1, a2) => (dynCall_jii = Module["dynCall_jii"] = wasmExports["dc"])(a0, a1, a2); - -var dynCall_viidii = Module["dynCall_viidii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viidii = Module["dynCall_viidii"] = wasmExports["ec"])(a0, a1, a2, a3, a4, a5); - -var _asyncify_start_unwind = a0 => (_asyncify_start_unwind = wasmExports["fc"])(a0); - -var _asyncify_stop_unwind = () => (_asyncify_stop_unwind = wasmExports["gc"])(); - -var _asyncify_start_rewind = a0 => (_asyncify_start_rewind = wasmExports["hc"])(a0); - -var _asyncify_stop_rewind = () => (_asyncify_stop_rewind = wasmExports["ic"])(); - -function invoke_vii(index, a1, a2) { - var sp = stackSave(); - try { - dynCall_vii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_iii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vi(index, a1) { - var sp = stackSave(); - try { - dynCall_vi(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_i(index) { - var sp = stackSave(); - try { - return dynCall_i(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_v(index) { - var sp = stackSave(); - try { - dynCall_v(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viii(index, a1, a2, a3) { - var sp = stackSave(); - try { - dynCall_viii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_ii(index, a1) { - var sp = stackSave(); - try { - return dynCall_ii(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - dynCall_viiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - return dynCall_iiiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiii(index, a1, a2, a3) { - var sp = stackSave(); - try { - return dynCall_iiii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viidii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viidii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - return dynCall_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - return dynCall_iiiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_jii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_jii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['wb'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['xb'])(a0)); + + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['yb'])(a0)); + + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['zb'])(a0)); + + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = wasmExports['Ab'])( + a0 + )); + + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['Bb'])(a0)); + + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['Cb'])()); + + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['Db'])()); + + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = wasmExports['Eb'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['Fb'])(a0)); + + var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports['Gb'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = wasmExports['Hb'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['Ib'])(a0, a1); + + var _setThrew = (a0, a1) => (_setThrew = wasmExports['Jb'])(a0, a1); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['Kb'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['Lb'])(a0); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['Mb'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = wasmExports['Nb'])(); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['Ob'])(a0, a1)); + + var dynCall_iiii = (Module['dynCall_iiii'] = (a0, a1, a2, a3) => + (dynCall_iiii = Module['dynCall_iiii'] = wasmExports['Pb'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_ii = (Module['dynCall_ii'] = (a0, a1) => + (dynCall_ii = Module['dynCall_ii'] = wasmExports['Qb'])(a0, a1)); + + var dynCall_vii = (Module['dynCall_vii'] = (a0, a1, a2) => + (dynCall_vii = Module['dynCall_vii'] = wasmExports['Rb'])(a0, a1, a2)); + + var dynCall_iii = (Module['dynCall_iii'] = (a0, a1, a2) => + (dynCall_iii = Module['dynCall_iii'] = wasmExports['Sb'])(a0, a1, a2)); + + var dynCall_iiiii = (Module['dynCall_iiiii'] = (a0, a1, a2, a3, a4) => + (dynCall_iiiii = Module['dynCall_iiiii'] = wasmExports['Tb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iiiiii = (Module['dynCall_iiiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_iiiiii = Module['dynCall_iiiiii'] = wasmExports['Ub'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_viiii = (Module['dynCall_viiii'] = (a0, a1, a2, a3, a4) => + (dynCall_viiii = Module['dynCall_viiii'] = wasmExports['Vb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_viii = (Module['dynCall_viii'] = (a0, a1, a2, a3) => + (dynCall_viii = Module['dynCall_viii'] = wasmExports['Wb'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_viiiii = (Module['dynCall_viiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viiiii = Module['dynCall_viiiii'] = wasmExports['Xb'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_iiiiiii = (Module['dynCall_iiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_iiiiiii = Module['dynCall_iiiiiii'] = wasmExports['Yb'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_i = (Module['dynCall_i'] = (a0) => + (dynCall_i = Module['dynCall_i'] = wasmExports['Zb'])(a0)); + + var dynCall_v = (Module['dynCall_v'] = (a0) => + (dynCall_v = Module['dynCall_v'] = wasmExports['_b'])(a0)); + + var dynCall_viiiiiiiii = (Module['dynCall_viiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_viiiiiiiii = Module['dynCall_viiiiiiiii'] = wasmExports['$b'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_viiiiii = (Module['dynCall_viiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_viiiiii = Module['dynCall_viiiiii'] = wasmExports['ac'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_iiiiiiii = (Module['dynCall_iiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_iiiiiiii = Module['dynCall_iiiiiiii'] = wasmExports['bc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_iiiiiiiiii = (Module['dynCall_iiiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_iiiiiiiiii = Module['dynCall_iiiiiiiiii'] = wasmExports['cc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_jii = (Module['dynCall_jii'] = (a0, a1, a2) => + (dynCall_jii = Module['dynCall_jii'] = wasmExports['dc'])(a0, a1, a2)); + + var dynCall_viidii = (Module['dynCall_viidii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viidii = Module['dynCall_viidii'] = wasmExports['ec'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var _asyncify_start_unwind = (a0) => + (_asyncify_start_unwind = wasmExports['fc'])(a0); + + var _asyncify_stop_unwind = () => + (_asyncify_stop_unwind = wasmExports['gc'])(); + + var _asyncify_start_rewind = (a0) => + (_asyncify_start_rewind = wasmExports['hc'])(a0); + + var _asyncify_stop_rewind = () => + (_asyncify_stop_rewind = wasmExports['ic'])(); + + function invoke_vii(index, a1, a2) { + var sp = stackSave(); + try { + dynCall_vii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_iii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vi(index, a1) { + var sp = stackSave(); + try { + dynCall_vi(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_i(index) { + var sp = stackSave(); + try { + return dynCall_i(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_v(index) { + var sp = stackSave(); + try { + dynCall_v(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viii(index, a1, a2, a3) { + var sp = stackSave(); + try { + dynCall_viii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_ii(index, a1) { + var sp = stackSave(); + try { + return dynCall_ii(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + dynCall_viiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + return dynCall_iiiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiii(index, a1, a2, a3) { + var sp = stackSave(); + try { + return dynCall_iiii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viidii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viidii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + return dynCall_iiiiiiiiii( + index, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + return dynCall_iiiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_jii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_jii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/asyncify/php_7_4.js b/packages/php-wasm/node/asyncify/php_7_4.js index 91a4ad6169..2fc4504a44 100644 --- a/packages/php-wasm/node/asyncify/php_7_4.js +++ b/packages/php-wasm/node/asyncify/php_7_4.js @@ -1,6622 +1,7672 @@ -const dependencyFilename = __dirname + '/7_4_33/php_7_4.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 14955932; +const dependencyFilename = __dirname + '/7_4_33/php_7_4.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 14955932; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - return { - "a": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["bb"]; - updateMemoryViews(); - wasmTable = wasmExports["eb"]; - addOnInit(wasmExports["cb"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function js_popen_to_file(command, mode, exitCodePtr) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); -} - -function wasm_poll_socket(socketd, events, timeout) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); -} - -function js_fd_read(fd, iov, iovcnt, pnum) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); -} - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var stackRestore = val => __emscripten_stack_restore(val); - -var stackSave = () => _emscripten_stack_get_current(); - -/** @type {function(...*):?} */ function _SharpYuvConvert() { - abort("missing function: SharpYuvConvert"); -} - -_SharpYuvConvert.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { - abort("missing function: SharpYuvGetConversionMatrix"); -} - -_SharpYuvGetConversionMatrix.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvInit() { - abort("missing function: SharpYuvInit"); -} - -_SharpYuvInit.stub = true; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_fallocate(fd, mode, offset_low, offset_high, len_low, len_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - var len = convertI32PairToI53Checked(len_low, len_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.allocate(stream, offset, len); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fdatasync(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -var __emscripten_throw_longjmp = () => { - throw Infinity; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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; - } -} - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + return { + a: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['bb']; + updateMemoryViews(); + wasmTable = wasmExports['eb']; + addOnInit(wasmExports['cb']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function js_popen_to_file(command, mode, exitCodePtr) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce((acc, curr) => acc + curr.length, 0) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + } + + function wasm_poll_socket(socketd, events, timeout) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + } + + function js_fd_read(fd, iov, iovcnt, pnum) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + } + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + /** @type {function(...*):?} */ function _SharpYuvConvert() { + abort('missing function: SharpYuvConvert'); + } + + _SharpYuvConvert.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { + abort('missing function: SharpYuvGetConversionMatrix'); + } + + _SharpYuvGetConversionMatrix.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvInit() { + abort('missing function: SharpYuvInit'); + } + + _SharpYuvInit.stub = true; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_fallocate( + fd, + mode, + offset_low, + offset_high, + len_low, + len_high + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + var len = convertI32PairToI53Checked(len_low, len_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.allocate(stream, offset, len); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fdatasync(fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + var __emscripten_throw_longjmp = () => { + throw Infinity; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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; + } + } + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6627,898 +7677,1195 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -function _wasm_shutdown(socketd, how) { - return PHPWASM.shutdownSocket(socketd, how); -} - -/** @type {WebAssembly.Table} */ var wasmTable; - -var runAndAbortIfError = func => { - try { - return func(); - } catch (e) { - abort(e); - } -}; - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - } - } - }, - instrumentWasmExports(exports) { - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - ret[x] = (...args) => { - Asyncify.exportCallStack.push(x); - try { - return original(...args); - } finally { - if (!ABORT) { - var y = Asyncify.exportCallStack.pop(); - Asyncify.maybeStopUnwind(); - } - } - }; - } else { - ret[x] = original; - } - } - return ret; - }, - State: { - Normal: 0, - Unwinding: 1, - Rewinding: 2, - Disabled: 3 - }, - state: 0, - StackSize: 4096, - currData: null, - handleSleepReturnValue: 0, - exportCallStack: [], - callStackNameToId: {}, - callStackIdToName: {}, - callStackId: 0, - asyncPromiseHandlers: null, - sleepCallbacks: [], - getCallStackId(funcName) { - var id = Asyncify.callStackNameToId[funcName]; - if (id === undefined) { - id = Asyncify.callStackId++; - Asyncify.callStackNameToId[funcName] = id; - Asyncify.callStackIdToName[id] = funcName; - } - return id; - }, - maybeStopUnwind() { - if (Asyncify.currData && Asyncify.state === Asyncify.State.Unwinding && Asyncify.exportCallStack.length === 0) { - Asyncify.state = Asyncify.State.Normal; - runtimeKeepalivePush(); - runAndAbortIfError(_asyncify_stop_unwind); - if (typeof Fibers != "undefined") { - Fibers.trampoline(); - } - } - }, - whenDone() { - return new Promise((resolve, reject) => { - Asyncify.asyncPromiseHandlers = { - resolve: resolve, - reject: 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)] = stack; - HEAPU32[(((ptr) + (4)) >> 2)] = stack + stackSize; - }, - setDataRewindFunc(ptr) { - var bottomOfCallStack = Asyncify.exportCallStack[0]; - var rewindId = Asyncify.getCallStackId(bottomOfCallStack); - HEAP32[(((ptr) + (8)) >> 2)] = rewindId; - }, - getDataRewindFuncName(ptr) { - var id = HEAP32[(((ptr) + (8)) >> 2)]; - var name = Asyncify.callStackIdToName[id]; - return name; - }, - getDataRewindFunc(name) { - var func = wasmExports[name]; - return func; - }, - doRewind(ptr) { - var name = Asyncify.getDataRewindFuncName(ptr); - var func = Asyncify.getDataRewindFunc(name); - runtimeKeepalivePop(); - return 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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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) { - return Asyncify.handleSleep(wakeUp => { - startAsync().then(wakeUp); - }); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var previousAsync = Asyncify.currData; - var ret = func(...cArgs); - function onDone(ret) { - runtimeKeepalivePop(); - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - runtimeKeepalivePush(); - if (Asyncify.currData != previousAsync) { - return Asyncify.whenDone().then(onDone); - } - ret = onDone(ret); - if (asyncMode) return Promise.resolve(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ ab: _SharpYuvConvert, - /** @export */ $a: _SharpYuvGetConversionMatrix, - /** @export */ _a: _SharpYuvInit, - /** @export */ n: ___assert_fail, - /** @export */ Y: __asyncjs__js_module_onMessage, - /** @export */ Za: ___call_sighandler, - /** @export */ Ya: ___syscall_accept4, - /** @export */ Xa: ___syscall_bind, - /** @export */ Wa: ___syscall_chdir, - /** @export */ Q: ___syscall_chmod, - /** @export */ Va: ___syscall_connect, - /** @export */ Ua: ___syscall_dup, - /** @export */ Ta: ___syscall_dup3, - /** @export */ Sa: ___syscall_faccessat, - /** @export */ aa: ___syscall_fallocate, - /** @export */ Ra: ___syscall_fchmod, - /** @export */ Qa: ___syscall_fchown32, - /** @export */ P: ___syscall_fchownat, - /** @export */ m: ___syscall_fcntl64, - /** @export */ Pa: ___syscall_fdatasync, - /** @export */ Oa: ___syscall_fstat64, - /** @export */ ha: ___syscall_ftruncate64, - /** @export */ Na: ___syscall_getcwd, - /** @export */ Ma: ___syscall_getdents64, - /** @export */ La: ___syscall_getpeername, - /** @export */ Ka: ___syscall_getsockname, - /** @export */ Ja: ___syscall_getsockopt, - /** @export */ E: ___syscall_ioctl, - /** @export */ Ia: ___syscall_listen, - /** @export */ Ha: ___syscall_lstat64, - /** @export */ Ga: ___syscall_mkdirat, - /** @export */ Fa: ___syscall_newfstatat, - /** @export */ x: ___syscall_openat, - /** @export */ Ea: ___syscall_pipe, - /** @export */ Da: ___syscall_poll, - /** @export */ Ca: ___syscall_readlinkat, - /** @export */ Ba: ___syscall_recvfrom, - /** @export */ Aa: ___syscall_renameat, - /** @export */ O: ___syscall_rmdir, - /** @export */ za: ___syscall_sendto, - /** @export */ N: ___syscall_socket, - /** @export */ ya: ___syscall_stat64, - /** @export */ xa: ___syscall_statfs64, - /** @export */ wa: ___syscall_symlink, - /** @export */ D: ___syscall_unlinkat, - /** @export */ va: ___syscall_utimensat, - /** @export */ ra: __abort_js, - /** @export */ qa: __emscripten_get_now_is_monotonic, - /** @export */ pa: __emscripten_lookup_name, - /** @export */ oa: __emscripten_memcpy_js, - /** @export */ na: __emscripten_runtime_keepalive_clear, - /** @export */ ma: __emscripten_throw_longjmp, - /** @export */ da: __gmtime_js, - /** @export */ ea: __localtime_js, - /** @export */ fa: __mktime_js, - /** @export */ ba: __mmap_js, - /** @export */ ca: __munmap_js, - /** @export */ K: __setitimer_js, - /** @export */ la: __tzset_js, - /** @export */ B: _emscripten_date_now, - /** @export */ ka: _emscripten_get_heap_max, - /** @export */ v: _emscripten_get_now, - /** @export */ ja: _emscripten_resize_heap, - /** @export */ J: _emscripten_sleep, - /** @export */ ua: _environ_get, - /** @export */ ta: _environ_sizes_get, - /** @export */ p: _exit, - /** @export */ q: _fd_close, - /** @export */ M: _fd_fdstat_get, - /** @export */ L: _fd_read, - /** @export */ ga: _fd_seek, - /** @export */ C: _fd_write, - /** @export */ I: _getaddrinfo, - /** @export */ A: _getnameinfo, - /** @export */ $: _getprotobyname, - /** @export */ _: _getprotobynumber, - /** @export */ i: invoke_i, - /** @export */ d: invoke_ii, - /** @export */ b: invoke_iii, - /** @export */ f: invoke_iiii, - /** @export */ g: invoke_iiiii, - /** @export */ r: invoke_iiiiii, - /** @export */ u: invoke_iiiiiii, - /** @export */ w: invoke_iiiiiiii, - /** @export */ H: invoke_iiiiiiiiii, - /** @export */ ia: invoke_jii, - /** @export */ e: invoke_v, - /** @export */ a: invoke_vi, - /** @export */ c: invoke_vii, - /** @export */ z: invoke_viidii, - /** @export */ h: invoke_viii, - /** @export */ k: invoke_viiii, - /** @export */ l: invoke_viiiii, - /** @export */ j: invoke_viiiiii, - /** @export */ y: invoke_viiiiiiiii, - /** @export */ G: _js_create_input_device, - /** @export */ Z: js_fd_read, - /** @export */ F: _js_open_process, - /** @export */ X: js_popen_to_file, - /** @export */ W: _js_process_status, - /** @export */ V: _js_waitpid, - /** @export */ sa: _proc_exit, - /** @export */ U: _strftime, - /** @export */ T: _strftime_l, - /** @export */ S: _strptime, - /** @export */ s: _wasm_close, - /** @export */ t: wasm_poll_socket, - /** @export */ o: _wasm_setsockopt, - /** @export */ R: _wasm_shutdown -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["cb"])(); - -var _free = a0 => (_free = wasmExports["db"])(a0); - -var _malloc = a0 => (_malloc = wasmExports["fb"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["gb"])(a0, a1, a2); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["hb"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["ib"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["jb"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["kb"])(a0, a1, a2, a3); - -var _htons = a0 => (_htons = wasmExports["lb"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["mb"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["nb"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["ob"])(a0); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["pb"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["qb"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["rb"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["sb"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["tb"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["ub"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["vb"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["wb"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["xb"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["yb"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["zb"])(a0); - -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["Ab"])(a0); - -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["Bb"])(a0); - -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["Cb"])(a0); - -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["Db"])(a0); - -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["Eb"])(a0); - -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["Fb"])(a0); - -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["Gb"])(a0); - -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["Hb"])(); - -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["Ib"])(); - -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["Jb"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["Kb"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["Lb"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["Mb"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["Nb"])(a0, a1); - -var _setThrew = (a0, a1) => (_setThrew = wasmExports["Ob"])(a0, a1); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["Pb"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["Qb"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["Rb"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["Sb"])(); - -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["Tb"])(a0, a1); - -var dynCall_vii = Module["dynCall_vii"] = (a0, a1, a2) => (dynCall_vii = Module["dynCall_vii"] = wasmExports["Ub"])(a0, a1, a2); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + function _wasm_shutdown(socketd, how) { + return PHPWASM.shutdownSocket(socketd, how); + } + + /** @type {WebAssembly.Table} */ var wasmTable; + + var runAndAbortIfError = (func) => { + try { + return func(); + } catch (e) { + abort(e); + } + }; + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + } + } + }, + instrumentWasmExports(exports) { + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + ret[x] = (...args) => { + Asyncify.exportCallStack.push(x); + try { + return original(...args); + } finally { + if (!ABORT) { + var y = Asyncify.exportCallStack.pop(); + Asyncify.maybeStopUnwind(); + } + } + }; + } else { + ret[x] = original; + } + } + return ret; + }, + State: { + Normal: 0, + Unwinding: 1, + Rewinding: 2, + Disabled: 3, + }, + state: 0, + StackSize: 4096, + currData: null, + handleSleepReturnValue: 0, + exportCallStack: [], + callStackNameToId: {}, + callStackIdToName: {}, + callStackId: 0, + asyncPromiseHandlers: null, + sleepCallbacks: [], + getCallStackId(funcName) { + var id = Asyncify.callStackNameToId[funcName]; + if (id === undefined) { + id = Asyncify.callStackId++; + Asyncify.callStackNameToId[funcName] = id; + Asyncify.callStackIdToName[id] = funcName; + } + return id; + }, + maybeStopUnwind() { + if ( + Asyncify.currData && + Asyncify.state === Asyncify.State.Unwinding && + Asyncify.exportCallStack.length === 0 + ) { + Asyncify.state = Asyncify.State.Normal; + runtimeKeepalivePush(); + runAndAbortIfError(_asyncify_stop_unwind); + if (typeof Fibers != 'undefined') { + Fibers.trampoline(); + } + } + }, + whenDone() { + return new Promise((resolve, reject) => { + Asyncify.asyncPromiseHandlers = { + resolve: resolve, + reject: 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] = stack; + HEAPU32[(ptr + 4) >> 2] = stack + stackSize; + }, + setDataRewindFunc(ptr) { + var bottomOfCallStack = Asyncify.exportCallStack[0]; + var rewindId = Asyncify.getCallStackId(bottomOfCallStack); + HEAP32[(ptr + 8) >> 2] = rewindId; + }, + getDataRewindFuncName(ptr) { + var id = HEAP32[(ptr + 8) >> 2]; + var name = Asyncify.callStackIdToName[id]; + return name; + }, + getDataRewindFunc(name) { + var func = wasmExports[name]; + return func; + }, + doRewind(ptr) { + var name = Asyncify.getDataRewindFuncName(ptr); + var func = Asyncify.getDataRewindFunc(name); + runtimeKeepalivePop(); + return 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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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) { + return Asyncify.handleSleep((wakeUp) => { + startAsync().then(wakeUp); + }); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var previousAsync = Asyncify.currData; + var ret = func(...cArgs); + function onDone(ret) { + runtimeKeepalivePop(); + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + runtimeKeepalivePush(); + if (Asyncify.currData != previousAsync) { + return Asyncify.whenDone().then(onDone); + } + ret = onDone(ret); + if (asyncMode) return Promise.resolve(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ ab: _SharpYuvConvert, + /** @export */ $a: _SharpYuvGetConversionMatrix, + /** @export */ _a: _SharpYuvInit, + /** @export */ n: ___assert_fail, + /** @export */ Y: __asyncjs__js_module_onMessage, + /** @export */ Za: ___call_sighandler, + /** @export */ Ya: ___syscall_accept4, + /** @export */ Xa: ___syscall_bind, + /** @export */ Wa: ___syscall_chdir, + /** @export */ Q: ___syscall_chmod, + /** @export */ Va: ___syscall_connect, + /** @export */ Ua: ___syscall_dup, + /** @export */ Ta: ___syscall_dup3, + /** @export */ Sa: ___syscall_faccessat, + /** @export */ aa: ___syscall_fallocate, + /** @export */ Ra: ___syscall_fchmod, + /** @export */ Qa: ___syscall_fchown32, + /** @export */ P: ___syscall_fchownat, + /** @export */ m: ___syscall_fcntl64, + /** @export */ Pa: ___syscall_fdatasync, + /** @export */ Oa: ___syscall_fstat64, + /** @export */ ha: ___syscall_ftruncate64, + /** @export */ Na: ___syscall_getcwd, + /** @export */ Ma: ___syscall_getdents64, + /** @export */ La: ___syscall_getpeername, + /** @export */ Ka: ___syscall_getsockname, + /** @export */ Ja: ___syscall_getsockopt, + /** @export */ E: ___syscall_ioctl, + /** @export */ Ia: ___syscall_listen, + /** @export */ Ha: ___syscall_lstat64, + /** @export */ Ga: ___syscall_mkdirat, + /** @export */ Fa: ___syscall_newfstatat, + /** @export */ x: ___syscall_openat, + /** @export */ Ea: ___syscall_pipe, + /** @export */ Da: ___syscall_poll, + /** @export */ Ca: ___syscall_readlinkat, + /** @export */ Ba: ___syscall_recvfrom, + /** @export */ Aa: ___syscall_renameat, + /** @export */ O: ___syscall_rmdir, + /** @export */ za: ___syscall_sendto, + /** @export */ N: ___syscall_socket, + /** @export */ ya: ___syscall_stat64, + /** @export */ xa: ___syscall_statfs64, + /** @export */ wa: ___syscall_symlink, + /** @export */ D: ___syscall_unlinkat, + /** @export */ va: ___syscall_utimensat, + /** @export */ ra: __abort_js, + /** @export */ qa: __emscripten_get_now_is_monotonic, + /** @export */ pa: __emscripten_lookup_name, + /** @export */ oa: __emscripten_memcpy_js, + /** @export */ na: __emscripten_runtime_keepalive_clear, + /** @export */ ma: __emscripten_throw_longjmp, + /** @export */ da: __gmtime_js, + /** @export */ ea: __localtime_js, + /** @export */ fa: __mktime_js, + /** @export */ ba: __mmap_js, + /** @export */ ca: __munmap_js, + /** @export */ K: __setitimer_js, + /** @export */ la: __tzset_js, + /** @export */ B: _emscripten_date_now, + /** @export */ ka: _emscripten_get_heap_max, + /** @export */ v: _emscripten_get_now, + /** @export */ ja: _emscripten_resize_heap, + /** @export */ J: _emscripten_sleep, + /** @export */ ua: _environ_get, + /** @export */ ta: _environ_sizes_get, + /** @export */ p: _exit, + /** @export */ q: _fd_close, + /** @export */ M: _fd_fdstat_get, + /** @export */ L: _fd_read, + /** @export */ ga: _fd_seek, + /** @export */ C: _fd_write, + /** @export */ I: _getaddrinfo, + /** @export */ A: _getnameinfo, + /** @export */ $: _getprotobyname, + /** @export */ _: _getprotobynumber, + /** @export */ i: invoke_i, + /** @export */ d: invoke_ii, + /** @export */ b: invoke_iii, + /** @export */ f: invoke_iiii, + /** @export */ g: invoke_iiiii, + /** @export */ r: invoke_iiiiii, + /** @export */ u: invoke_iiiiiii, + /** @export */ w: invoke_iiiiiiii, + /** @export */ H: invoke_iiiiiiiiii, + /** @export */ ia: invoke_jii, + /** @export */ e: invoke_v, + /** @export */ a: invoke_vi, + /** @export */ c: invoke_vii, + /** @export */ z: invoke_viidii, + /** @export */ h: invoke_viii, + /** @export */ k: invoke_viiii, + /** @export */ l: invoke_viiiii, + /** @export */ j: invoke_viiiiii, + /** @export */ y: invoke_viiiiiiiii, + /** @export */ G: _js_create_input_device, + /** @export */ Z: js_fd_read, + /** @export */ F: _js_open_process, + /** @export */ X: js_popen_to_file, + /** @export */ W: _js_process_status, + /** @export */ V: _js_waitpid, + /** @export */ sa: _proc_exit, + /** @export */ U: _strftime, + /** @export */ T: _strftime_l, + /** @export */ S: _strptime, + /** @export */ s: _wasm_close, + /** @export */ t: wasm_poll_socket, + /** @export */ o: _wasm_setsockopt, + /** @export */ R: _wasm_shutdown, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports['cb'])(); + + var _free = (a0) => (_free = wasmExports['db'])(a0); + + var _malloc = (a0) => (_malloc = wasmExports['fb'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['gb'])(a0, a1, a2)); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = wasmExports['hb'])( + a0, + a1, + a2 + )); + + var _fflush = (a0) => (_fflush = wasmExports['ib'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['jb'])(a0, a1)); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = wasmExports['kb'])( + a0, + a1, + a2, + a3 + )); + + var _htons = (a0) => (_htons = wasmExports['lb'])(a0); + + var _ntohs = (a0) => (_ntohs = wasmExports['mb'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['nb'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['ob'])(a0)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = wasmExports['pb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = wasmExports['qb'])( + a0 + )); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['rb'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['sb'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['tb'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['ub'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['vb'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['wb'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['xb'])(a0)); + + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['yb'])(a0)); + + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['zb'])(a0)); + + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['Ab'])(a0)); -var dynCall_viii = Module["dynCall_viii"] = (a0, a1, a2, a3) => (dynCall_viii = Module["dynCall_viii"] = wasmExports["Vb"])(a0, a1, a2, a3); - -var dynCall_ii = Module["dynCall_ii"] = (a0, a1) => (dynCall_ii = Module["dynCall_ii"] = wasmExports["Wb"])(a0, a1); - -var dynCall_iiii = Module["dynCall_iiii"] = (a0, a1, a2, a3) => (dynCall_iiii = Module["dynCall_iiii"] = wasmExports["Xb"])(a0, a1, a2, a3); - -var dynCall_iiiiii = Module["dynCall_iiiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_iiiiii = Module["dynCall_iiiiii"] = wasmExports["Yb"])(a0, a1, a2, a3, a4, a5); - -var dynCall_iiiii = Module["dynCall_iiiii"] = (a0, a1, a2, a3, a4) => (dynCall_iiiii = Module["dynCall_iiiii"] = wasmExports["Zb"])(a0, a1, a2, a3, a4); - -var dynCall_iii = Module["dynCall_iii"] = (a0, a1, a2) => (dynCall_iii = Module["dynCall_iii"] = wasmExports["_b"])(a0, a1, a2); - -var dynCall_viiiii = Module["dynCall_viiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viiiii = Module["dynCall_viiiii"] = wasmExports["$b"])(a0, a1, a2, a3, a4, a5); - -var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_iiiiiii = Module["dynCall_iiiiiii"] = wasmExports["ac"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_i = Module["dynCall_i"] = a0 => (dynCall_i = Module["dynCall_i"] = wasmExports["bc"])(a0); - -var dynCall_v = Module["dynCall_v"] = a0 => (dynCall_v = Module["dynCall_v"] = wasmExports["cc"])(a0); - -var dynCall_viiii = Module["dynCall_viiii"] = (a0, a1, a2, a3, a4) => (dynCall_viiii = Module["dynCall_viiii"] = wasmExports["dc"])(a0, a1, a2, a3, a4); - -var dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = wasmExports["ec"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_viiiiii = Module["dynCall_viiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_viiiiii = Module["dynCall_viiiiii"] = wasmExports["fc"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = wasmExports["gc"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = wasmExports["hc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_jii = Module["dynCall_jii"] = (a0, a1, a2) => (dynCall_jii = Module["dynCall_jii"] = wasmExports["ic"])(a0, a1, a2); - -var dynCall_viidii = Module["dynCall_viidii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viidii = Module["dynCall_viidii"] = wasmExports["jc"])(a0, a1, a2, a3, a4, a5); - -var _asyncify_start_unwind = a0 => (_asyncify_start_unwind = wasmExports["kc"])(a0); - -var _asyncify_stop_unwind = () => (_asyncify_stop_unwind = wasmExports["lc"])(); - -var _asyncify_start_rewind = a0 => (_asyncify_start_rewind = wasmExports["mc"])(a0); - -var _asyncify_stop_rewind = () => (_asyncify_stop_rewind = wasmExports["nc"])(); - -function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vi(index, a1) { - var sp = stackSave(); - try { - dynCall_vi(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vii(index, a1, a2) { - var sp = stackSave(); - try { - dynCall_vii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_i(index) { - var sp = stackSave(); - try { - return dynCall_i(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viii(index, a1, a2, a3) { - var sp = stackSave(); - try { - dynCall_viii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_v(index) { - var sp = stackSave(); - try { - dynCall_v(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_ii(index, a1) { - var sp = stackSave(); - try { - return dynCall_ii(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_iii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - dynCall_viiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - return dynCall_iiiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiii(index, a1, a2, a3) { - var sp = stackSave(); - try { - return dynCall_iiii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viidii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viidii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - return dynCall_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - return dynCall_iiiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_jii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_jii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['Bb'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['Cb'])(a0)); + + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['Db'])(a0)); + + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['Eb'])(a0)); + + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = wasmExports['Fb'])( + a0 + )); + + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['Gb'])(a0)); + + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['Hb'])()); + + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['Ib'])()); + + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = wasmExports['Jb'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['Kb'])(a0)); + + var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports['Lb'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = wasmExports['Mb'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['Nb'])(a0, a1); + + var _setThrew = (a0, a1) => (_setThrew = wasmExports['Ob'])(a0, a1); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['Pb'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['Qb'])(a0); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['Rb'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = wasmExports['Sb'])(); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['Tb'])(a0, a1)); + + var dynCall_vii = (Module['dynCall_vii'] = (a0, a1, a2) => + (dynCall_vii = Module['dynCall_vii'] = wasmExports['Ub'])(a0, a1, a2)); + + var dynCall_viii = (Module['dynCall_viii'] = (a0, a1, a2, a3) => + (dynCall_viii = Module['dynCall_viii'] = wasmExports['Vb'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_ii = (Module['dynCall_ii'] = (a0, a1) => + (dynCall_ii = Module['dynCall_ii'] = wasmExports['Wb'])(a0, a1)); + + var dynCall_iiii = (Module['dynCall_iiii'] = (a0, a1, a2, a3) => + (dynCall_iiii = Module['dynCall_iiii'] = wasmExports['Xb'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_iiiiii = (Module['dynCall_iiiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_iiiiii = Module['dynCall_iiiiii'] = wasmExports['Yb'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_iiiii = (Module['dynCall_iiiii'] = (a0, a1, a2, a3, a4) => + (dynCall_iiiii = Module['dynCall_iiiii'] = wasmExports['Zb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iii = (Module['dynCall_iii'] = (a0, a1, a2) => + (dynCall_iii = Module['dynCall_iii'] = wasmExports['_b'])(a0, a1, a2)); + + var dynCall_viiiii = (Module['dynCall_viiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viiiii = Module['dynCall_viiiii'] = wasmExports['$b'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_iiiiiii = (Module['dynCall_iiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_iiiiiii = Module['dynCall_iiiiiii'] = wasmExports['ac'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_i = (Module['dynCall_i'] = (a0) => + (dynCall_i = Module['dynCall_i'] = wasmExports['bc'])(a0)); + + var dynCall_v = (Module['dynCall_v'] = (a0) => + (dynCall_v = Module['dynCall_v'] = wasmExports['cc'])(a0)); + + var dynCall_viiii = (Module['dynCall_viiii'] = (a0, a1, a2, a3, a4) => + (dynCall_viiii = Module['dynCall_viiii'] = wasmExports['dc'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_viiiiiiiii = (Module['dynCall_viiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_viiiiiiiii = Module['dynCall_viiiiiiiii'] = wasmExports['ec'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_viiiiii = (Module['dynCall_viiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_viiiiii = Module['dynCall_viiiiii'] = wasmExports['fc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_iiiiiiii = (Module['dynCall_iiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_iiiiiiii = Module['dynCall_iiiiiiii'] = wasmExports['gc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_iiiiiiiiii = (Module['dynCall_iiiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_iiiiiiiiii = Module['dynCall_iiiiiiiiii'] = wasmExports['hc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_jii = (Module['dynCall_jii'] = (a0, a1, a2) => + (dynCall_jii = Module['dynCall_jii'] = wasmExports['ic'])(a0, a1, a2)); + + var dynCall_viidii = (Module['dynCall_viidii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viidii = Module['dynCall_viidii'] = wasmExports['jc'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var _asyncify_start_unwind = (a0) => + (_asyncify_start_unwind = wasmExports['kc'])(a0); + + var _asyncify_stop_unwind = () => + (_asyncify_stop_unwind = wasmExports['lc'])(); + + var _asyncify_start_rewind = (a0) => + (_asyncify_start_rewind = wasmExports['mc'])(a0); + + var _asyncify_stop_rewind = () => + (_asyncify_stop_rewind = wasmExports['nc'])(); + + function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vi(index, a1) { + var sp = stackSave(); + try { + dynCall_vi(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vii(index, a1, a2) { + var sp = stackSave(); + try { + dynCall_vii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_i(index) { + var sp = stackSave(); + try { + return dynCall_i(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viii(index, a1, a2, a3) { + var sp = stackSave(); + try { + dynCall_viii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_v(index) { + var sp = stackSave(); + try { + dynCall_v(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_ii(index, a1) { + var sp = stackSave(); + try { + return dynCall_ii(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_iii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + dynCall_viiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + return dynCall_iiiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiii(index, a1, a2, a3) { + var sp = stackSave(); + try { + return dynCall_iiii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viidii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viidii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + return dynCall_iiiiiiiiii( + index, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + return dynCall_iiiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_jii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_jii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/asyncify/php_8_0.js b/packages/php-wasm/node/asyncify/php_8_0.js index 82b0ddd56b..c922f8c698 100644 --- a/packages/php-wasm/node/asyncify/php_8_0.js +++ b/packages/php-wasm/node/asyncify/php_8_0.js @@ -1,6622 +1,7672 @@ -const dependencyFilename = __dirname + '/8_0_30/php_8_0.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 14465052; +const dependencyFilename = __dirname + '/8_0_30/php_8_0.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 14465052; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - return { - "a": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["cb"]; - updateMemoryViews(); - wasmTable = wasmExports["fb"]; - addOnInit(wasmExports["db"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function js_popen_to_file(command, mode, exitCodePtr) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); -} - -function wasm_poll_socket(socketd, events, timeout) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); -} - -function js_fd_read(fd, iov, iovcnt, pnum) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); -} - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var stackRestore = val => __emscripten_stack_restore(val); - -var stackSave = () => _emscripten_stack_get_current(); - -/** @type {function(...*):?} */ function _SharpYuvConvert() { - abort("missing function: SharpYuvConvert"); -} - -_SharpYuvConvert.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { - abort("missing function: SharpYuvGetConversionMatrix"); -} - -_SharpYuvGetConversionMatrix.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvInit() { - abort("missing function: SharpYuvInit"); -} - -_SharpYuvInit.stub = true; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_fallocate(fd, mode, offset_low, offset_high, len_low, len_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - var len = convertI32PairToI53Checked(len_low, len_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.allocate(stream, offset, len); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fdatasync(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -var __emscripten_throw_longjmp = () => { - throw Infinity; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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; - } -} - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + return { + a: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['cb']; + updateMemoryViews(); + wasmTable = wasmExports['fb']; + addOnInit(wasmExports['db']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function js_popen_to_file(command, mode, exitCodePtr) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce((acc, curr) => acc + curr.length, 0) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + } + + function wasm_poll_socket(socketd, events, timeout) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + } + + function js_fd_read(fd, iov, iovcnt, pnum) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + } + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + /** @type {function(...*):?} */ function _SharpYuvConvert() { + abort('missing function: SharpYuvConvert'); + } + + _SharpYuvConvert.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { + abort('missing function: SharpYuvGetConversionMatrix'); + } + + _SharpYuvGetConversionMatrix.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvInit() { + abort('missing function: SharpYuvInit'); + } + + _SharpYuvInit.stub = true; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_fallocate( + fd, + mode, + offset_low, + offset_high, + len_low, + len_high + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + var len = convertI32PairToI53Checked(len_low, len_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.allocate(stream, offset, len); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fdatasync(fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + var __emscripten_throw_longjmp = () => { + throw Infinity; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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; + } + } + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6627,912 +7677,1228 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -function _wasm_shutdown(socketd, how) { - return PHPWASM.shutdownSocket(socketd, how); -} - -/** @type {WebAssembly.Table} */ var wasmTable; - -var runAndAbortIfError = func => { - try { - return func(); - } catch (e) { - abort(e); - } -}; - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - } - } - }, - instrumentWasmExports(exports) { - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - ret[x] = (...args) => { - Asyncify.exportCallStack.push(x); - try { - return original(...args); - } finally { - if (!ABORT) { - var y = Asyncify.exportCallStack.pop(); - Asyncify.maybeStopUnwind(); - } - } - }; - } else { - ret[x] = original; - } - } - return ret; - }, - State: { - Normal: 0, - Unwinding: 1, - Rewinding: 2, - Disabled: 3 - }, - state: 0, - StackSize: 4096, - currData: null, - handleSleepReturnValue: 0, - exportCallStack: [], - callStackNameToId: {}, - callStackIdToName: {}, - callStackId: 0, - asyncPromiseHandlers: null, - sleepCallbacks: [], - getCallStackId(funcName) { - var id = Asyncify.callStackNameToId[funcName]; - if (id === undefined) { - id = Asyncify.callStackId++; - Asyncify.callStackNameToId[funcName] = id; - Asyncify.callStackIdToName[id] = funcName; - } - return id; - }, - maybeStopUnwind() { - if (Asyncify.currData && Asyncify.state === Asyncify.State.Unwinding && Asyncify.exportCallStack.length === 0) { - Asyncify.state = Asyncify.State.Normal; - runtimeKeepalivePush(); - runAndAbortIfError(_asyncify_stop_unwind); - if (typeof Fibers != "undefined") { - Fibers.trampoline(); - } - } - }, - whenDone() { - return new Promise((resolve, reject) => { - Asyncify.asyncPromiseHandlers = { - resolve: resolve, - reject: 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)] = stack; - HEAPU32[(((ptr) + (4)) >> 2)] = stack + stackSize; - }, - setDataRewindFunc(ptr) { - var bottomOfCallStack = Asyncify.exportCallStack[0]; - var rewindId = Asyncify.getCallStackId(bottomOfCallStack); - HEAP32[(((ptr) + (8)) >> 2)] = rewindId; - }, - getDataRewindFuncName(ptr) { - var id = HEAP32[(((ptr) + (8)) >> 2)]; - var name = Asyncify.callStackIdToName[id]; - return name; - }, - getDataRewindFunc(name) { - var func = wasmExports[name]; - return func; - }, - doRewind(ptr) { - var name = Asyncify.getDataRewindFuncName(ptr); - var func = Asyncify.getDataRewindFunc(name); - runtimeKeepalivePop(); - return 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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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) { - return Asyncify.handleSleep(wakeUp => { - startAsync().then(wakeUp); - }); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var previousAsync = Asyncify.currData; - var ret = func(...cArgs); - function onDone(ret) { - runtimeKeepalivePop(); - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - runtimeKeepalivePush(); - if (Asyncify.currData != previousAsync) { - return Asyncify.whenDone().then(onDone); - } - ret = onDone(ret); - if (asyncMode) return Promise.resolve(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ bb: _SharpYuvConvert, - /** @export */ ab: _SharpYuvGetConversionMatrix, - /** @export */ $a: _SharpYuvInit, - /** @export */ n: ___assert_fail, - /** @export */ Y: __asyncjs__js_module_onMessage, - /** @export */ _a: ___call_sighandler, - /** @export */ Za: ___syscall_accept4, - /** @export */ Ya: ___syscall_bind, - /** @export */ Xa: ___syscall_chdir, - /** @export */ Q: ___syscall_chmod, - /** @export */ Wa: ___syscall_connect, - /** @export */ Va: ___syscall_dup, - /** @export */ Ua: ___syscall_dup3, - /** @export */ Ta: ___syscall_faccessat, - /** @export */ ba: ___syscall_fallocate, - /** @export */ Sa: ___syscall_fchmod, - /** @export */ Ra: ___syscall_fchown32, - /** @export */ P: ___syscall_fchownat, - /** @export */ m: ___syscall_fcntl64, - /** @export */ Qa: ___syscall_fdatasync, - /** @export */ Pa: ___syscall_fstat64, - /** @export */ ia: ___syscall_ftruncate64, - /** @export */ Oa: ___syscall_getcwd, - /** @export */ Na: ___syscall_getdents64, - /** @export */ Ma: ___syscall_getpeername, - /** @export */ La: ___syscall_getsockname, - /** @export */ Ka: ___syscall_getsockopt, - /** @export */ E: ___syscall_ioctl, - /** @export */ Ja: ___syscall_listen, - /** @export */ Ia: ___syscall_lstat64, - /** @export */ Ha: ___syscall_mkdirat, - /** @export */ Ga: ___syscall_newfstatat, - /** @export */ x: ___syscall_openat, - /** @export */ Fa: ___syscall_pipe, - /** @export */ Ea: ___syscall_poll, - /** @export */ Da: ___syscall_readlinkat, - /** @export */ Ca: ___syscall_recvfrom, - /** @export */ Ba: ___syscall_renameat, - /** @export */ O: ___syscall_rmdir, - /** @export */ Aa: ___syscall_sendto, - /** @export */ N: ___syscall_socket, - /** @export */ za: ___syscall_stat64, - /** @export */ ya: ___syscall_statfs64, - /** @export */ xa: ___syscall_symlink, - /** @export */ D: ___syscall_unlinkat, - /** @export */ wa: ___syscall_utimensat, - /** @export */ sa: __abort_js, - /** @export */ ra: __emscripten_get_now_is_monotonic, - /** @export */ qa: __emscripten_lookup_name, - /** @export */ pa: __emscripten_memcpy_js, - /** @export */ oa: __emscripten_runtime_keepalive_clear, - /** @export */ na: __emscripten_throw_longjmp, - /** @export */ ea: __gmtime_js, - /** @export */ fa: __localtime_js, - /** @export */ ga: __mktime_js, - /** @export */ ca: __mmap_js, - /** @export */ da: __munmap_js, - /** @export */ K: __setitimer_js, - /** @export */ ma: __tzset_js, - /** @export */ B: _emscripten_date_now, - /** @export */ la: _emscripten_get_heap_max, - /** @export */ v: _emscripten_get_now, - /** @export */ ka: _emscripten_resize_heap, - /** @export */ J: _emscripten_sleep, - /** @export */ va: _environ_get, - /** @export */ ua: _environ_sizes_get, - /** @export */ p: _exit, - /** @export */ q: _fd_close, - /** @export */ M: _fd_fdstat_get, - /** @export */ L: _fd_read, - /** @export */ ha: _fd_seek, - /** @export */ C: _fd_write, - /** @export */ I: _getaddrinfo, - /** @export */ A: _getnameinfo, - /** @export */ aa: _getprotobyname, - /** @export */ $: _getprotobynumber, - /** @export */ k: invoke_i, - /** @export */ c: invoke_ii, - /** @export */ b: invoke_iii, - /** @export */ f: invoke_iiii, - /** @export */ g: invoke_iiiii, - /** @export */ r: invoke_iiiiii, - /** @export */ t: invoke_iiiiiii, - /** @export */ w: invoke_iiiiiiii, - /** @export */ H: invoke_iiiiiiiiii, - /** @export */ ja: invoke_jii, - /** @export */ e: invoke_v, - /** @export */ a: invoke_vi, - /** @export */ d: invoke_vii, - /** @export */ z: invoke_viidii, - /** @export */ h: invoke_viii, - /** @export */ i: invoke_viiii, - /** @export */ l: invoke_viiiii, - /** @export */ j: invoke_viiiiii, - /** @export */ _: invoke_viiiiiii, - /** @export */ y: invoke_viiiiiiiii, - /** @export */ G: _js_create_input_device, - /** @export */ Z: js_fd_read, - /** @export */ F: _js_open_process, - /** @export */ X: js_popen_to_file, - /** @export */ W: _js_process_status, - /** @export */ V: _js_waitpid, - /** @export */ ta: _proc_exit, - /** @export */ U: _strftime, - /** @export */ T: _strftime_l, - /** @export */ S: _strptime, - /** @export */ s: _wasm_close, - /** @export */ u: wasm_poll_socket, - /** @export */ o: _wasm_setsockopt, - /** @export */ R: _wasm_shutdown -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["db"])(); - -var _free = a0 => (_free = wasmExports["eb"])(a0); - -var _malloc = a0 => (_malloc = wasmExports["gb"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["hb"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["ib"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["jb"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["kb"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["lb"])(a0, a1, a2); - -var _htons = a0 => (_htons = wasmExports["mb"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["nb"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["ob"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["pb"])(a0); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["qb"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["rb"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["sb"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["tb"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["ub"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["vb"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["wb"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["xb"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["yb"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["zb"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["Ab"])(a0); - -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["Bb"])(a0); - -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["Cb"])(a0); - -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["Db"])(a0); - -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["Eb"])(a0); - -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["Fb"])(a0); - -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["Gb"])(a0); - -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["Hb"])(a0); - -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["Ib"])(); - -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["Jb"])(); - -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["Kb"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["Lb"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["Mb"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["Nb"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["Ob"])(a0, a1); - -var _setThrew = (a0, a1) => (_setThrew = wasmExports["Pb"])(a0, a1); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["Qb"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["Rb"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["Sb"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["Tb"])(); - -var dynCall_iiii = Module["dynCall_iiii"] = (a0, a1, a2, a3) => (dynCall_iiii = Module["dynCall_iiii"] = wasmExports["Ub"])(a0, a1, a2, a3); - -var dynCall_ii = Module["dynCall_ii"] = (a0, a1) => (dynCall_ii = Module["dynCall_ii"] = wasmExports["Vb"])(a0, a1); - -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["Wb"])(a0, a1); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + function _wasm_shutdown(socketd, how) { + return PHPWASM.shutdownSocket(socketd, how); + } + + /** @type {WebAssembly.Table} */ var wasmTable; + + var runAndAbortIfError = (func) => { + try { + return func(); + } catch (e) { + abort(e); + } + }; + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + } + } + }, + instrumentWasmExports(exports) { + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + ret[x] = (...args) => { + Asyncify.exportCallStack.push(x); + try { + return original(...args); + } finally { + if (!ABORT) { + var y = Asyncify.exportCallStack.pop(); + Asyncify.maybeStopUnwind(); + } + } + }; + } else { + ret[x] = original; + } + } + return ret; + }, + State: { + Normal: 0, + Unwinding: 1, + Rewinding: 2, + Disabled: 3, + }, + state: 0, + StackSize: 4096, + currData: null, + handleSleepReturnValue: 0, + exportCallStack: [], + callStackNameToId: {}, + callStackIdToName: {}, + callStackId: 0, + asyncPromiseHandlers: null, + sleepCallbacks: [], + getCallStackId(funcName) { + var id = Asyncify.callStackNameToId[funcName]; + if (id === undefined) { + id = Asyncify.callStackId++; + Asyncify.callStackNameToId[funcName] = id; + Asyncify.callStackIdToName[id] = funcName; + } + return id; + }, + maybeStopUnwind() { + if ( + Asyncify.currData && + Asyncify.state === Asyncify.State.Unwinding && + Asyncify.exportCallStack.length === 0 + ) { + Asyncify.state = Asyncify.State.Normal; + runtimeKeepalivePush(); + runAndAbortIfError(_asyncify_stop_unwind); + if (typeof Fibers != 'undefined') { + Fibers.trampoline(); + } + } + }, + whenDone() { + return new Promise((resolve, reject) => { + Asyncify.asyncPromiseHandlers = { + resolve: resolve, + reject: 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] = stack; + HEAPU32[(ptr + 4) >> 2] = stack + stackSize; + }, + setDataRewindFunc(ptr) { + var bottomOfCallStack = Asyncify.exportCallStack[0]; + var rewindId = Asyncify.getCallStackId(bottomOfCallStack); + HEAP32[(ptr + 8) >> 2] = rewindId; + }, + getDataRewindFuncName(ptr) { + var id = HEAP32[(ptr + 8) >> 2]; + var name = Asyncify.callStackIdToName[id]; + return name; + }, + getDataRewindFunc(name) { + var func = wasmExports[name]; + return func; + }, + doRewind(ptr) { + var name = Asyncify.getDataRewindFuncName(ptr); + var func = Asyncify.getDataRewindFunc(name); + runtimeKeepalivePop(); + return 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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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) { + return Asyncify.handleSleep((wakeUp) => { + startAsync().then(wakeUp); + }); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var previousAsync = Asyncify.currData; + var ret = func(...cArgs); + function onDone(ret) { + runtimeKeepalivePop(); + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + runtimeKeepalivePush(); + if (Asyncify.currData != previousAsync) { + return Asyncify.whenDone().then(onDone); + } + ret = onDone(ret); + if (asyncMode) return Promise.resolve(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ bb: _SharpYuvConvert, + /** @export */ ab: _SharpYuvGetConversionMatrix, + /** @export */ $a: _SharpYuvInit, + /** @export */ n: ___assert_fail, + /** @export */ Y: __asyncjs__js_module_onMessage, + /** @export */ _a: ___call_sighandler, + /** @export */ Za: ___syscall_accept4, + /** @export */ Ya: ___syscall_bind, + /** @export */ Xa: ___syscall_chdir, + /** @export */ Q: ___syscall_chmod, + /** @export */ Wa: ___syscall_connect, + /** @export */ Va: ___syscall_dup, + /** @export */ Ua: ___syscall_dup3, + /** @export */ Ta: ___syscall_faccessat, + /** @export */ ba: ___syscall_fallocate, + /** @export */ Sa: ___syscall_fchmod, + /** @export */ Ra: ___syscall_fchown32, + /** @export */ P: ___syscall_fchownat, + /** @export */ m: ___syscall_fcntl64, + /** @export */ Qa: ___syscall_fdatasync, + /** @export */ Pa: ___syscall_fstat64, + /** @export */ ia: ___syscall_ftruncate64, + /** @export */ Oa: ___syscall_getcwd, + /** @export */ Na: ___syscall_getdents64, + /** @export */ Ma: ___syscall_getpeername, + /** @export */ La: ___syscall_getsockname, + /** @export */ Ka: ___syscall_getsockopt, + /** @export */ E: ___syscall_ioctl, + /** @export */ Ja: ___syscall_listen, + /** @export */ Ia: ___syscall_lstat64, + /** @export */ Ha: ___syscall_mkdirat, + /** @export */ Ga: ___syscall_newfstatat, + /** @export */ x: ___syscall_openat, + /** @export */ Fa: ___syscall_pipe, + /** @export */ Ea: ___syscall_poll, + /** @export */ Da: ___syscall_readlinkat, + /** @export */ Ca: ___syscall_recvfrom, + /** @export */ Ba: ___syscall_renameat, + /** @export */ O: ___syscall_rmdir, + /** @export */ Aa: ___syscall_sendto, + /** @export */ N: ___syscall_socket, + /** @export */ za: ___syscall_stat64, + /** @export */ ya: ___syscall_statfs64, + /** @export */ xa: ___syscall_symlink, + /** @export */ D: ___syscall_unlinkat, + /** @export */ wa: ___syscall_utimensat, + /** @export */ sa: __abort_js, + /** @export */ ra: __emscripten_get_now_is_monotonic, + /** @export */ qa: __emscripten_lookup_name, + /** @export */ pa: __emscripten_memcpy_js, + /** @export */ oa: __emscripten_runtime_keepalive_clear, + /** @export */ na: __emscripten_throw_longjmp, + /** @export */ ea: __gmtime_js, + /** @export */ fa: __localtime_js, + /** @export */ ga: __mktime_js, + /** @export */ ca: __mmap_js, + /** @export */ da: __munmap_js, + /** @export */ K: __setitimer_js, + /** @export */ ma: __tzset_js, + /** @export */ B: _emscripten_date_now, + /** @export */ la: _emscripten_get_heap_max, + /** @export */ v: _emscripten_get_now, + /** @export */ ka: _emscripten_resize_heap, + /** @export */ J: _emscripten_sleep, + /** @export */ va: _environ_get, + /** @export */ ua: _environ_sizes_get, + /** @export */ p: _exit, + /** @export */ q: _fd_close, + /** @export */ M: _fd_fdstat_get, + /** @export */ L: _fd_read, + /** @export */ ha: _fd_seek, + /** @export */ C: _fd_write, + /** @export */ I: _getaddrinfo, + /** @export */ A: _getnameinfo, + /** @export */ aa: _getprotobyname, + /** @export */ $: _getprotobynumber, + /** @export */ k: invoke_i, + /** @export */ c: invoke_ii, + /** @export */ b: invoke_iii, + /** @export */ f: invoke_iiii, + /** @export */ g: invoke_iiiii, + /** @export */ r: invoke_iiiiii, + /** @export */ t: invoke_iiiiiii, + /** @export */ w: invoke_iiiiiiii, + /** @export */ H: invoke_iiiiiiiiii, + /** @export */ ja: invoke_jii, + /** @export */ e: invoke_v, + /** @export */ a: invoke_vi, + /** @export */ d: invoke_vii, + /** @export */ z: invoke_viidii, + /** @export */ h: invoke_viii, + /** @export */ i: invoke_viiii, + /** @export */ l: invoke_viiiii, + /** @export */ j: invoke_viiiiii, + /** @export */ _: invoke_viiiiiii, + /** @export */ y: invoke_viiiiiiiii, + /** @export */ G: _js_create_input_device, + /** @export */ Z: js_fd_read, + /** @export */ F: _js_open_process, + /** @export */ X: js_popen_to_file, + /** @export */ W: _js_process_status, + /** @export */ V: _js_waitpid, + /** @export */ ta: _proc_exit, + /** @export */ U: _strftime, + /** @export */ T: _strftime_l, + /** @export */ S: _strptime, + /** @export */ s: _wasm_close, + /** @export */ u: wasm_poll_socket, + /** @export */ o: _wasm_setsockopt, + /** @export */ R: _wasm_shutdown, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports['db'])(); + + var _free = (a0) => (_free = wasmExports['eb'])(a0); + + var _malloc = (a0) => (_malloc = wasmExports['gb'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['hb'])(a0, a1, a2)); + + var _fflush = (a0) => (_fflush = wasmExports['ib'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['jb'])(a0, a1)); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = wasmExports['kb'])( + a0, + a1, + a2, + a3 + )); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = wasmExports['lb'])( + a0, + a1, + a2 + )); + + var _htons = (a0) => (_htons = wasmExports['mb'])(a0); + + var _ntohs = (a0) => (_ntohs = wasmExports['nb'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['ob'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['pb'])(a0)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = wasmExports['qb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = wasmExports['rb'])( + a0 + )); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['sb'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['tb'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['ub'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['vb'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['wb'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['xb'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['yb'])(a0)); + + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['zb'])(a0)); + + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['Ab'])(a0)); -var dynCall_vii = Module["dynCall_vii"] = (a0, a1, a2) => (dynCall_vii = Module["dynCall_vii"] = wasmExports["Xb"])(a0, a1, a2); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['Bb'])(a0)); -var dynCall_viiiii = Module["dynCall_viiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viiiii = Module["dynCall_viiiii"] = wasmExports["Yb"])(a0, a1, a2, a3, a4, a5); - -var dynCall_iii = Module["dynCall_iii"] = (a0, a1, a2) => (dynCall_iii = Module["dynCall_iii"] = wasmExports["Zb"])(a0, a1, a2); - -var dynCall_iiiii = Module["dynCall_iiiii"] = (a0, a1, a2, a3, a4) => (dynCall_iiiii = Module["dynCall_iiiii"] = wasmExports["_b"])(a0, a1, a2, a3, a4); - -var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_iiiiiii = Module["dynCall_iiiiiii"] = wasmExports["$b"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_iiiiii = Module["dynCall_iiiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_iiiiii = Module["dynCall_iiiiii"] = wasmExports["ac"])(a0, a1, a2, a3, a4, a5); - -var dynCall_i = Module["dynCall_i"] = a0 => (dynCall_i = Module["dynCall_i"] = wasmExports["bc"])(a0); - -var dynCall_viii = Module["dynCall_viii"] = (a0, a1, a2, a3) => (dynCall_viii = Module["dynCall_viii"] = wasmExports["cc"])(a0, a1, a2, a3); - -var dynCall_viiii = Module["dynCall_viiii"] = (a0, a1, a2, a3, a4) => (dynCall_viiii = Module["dynCall_viiii"] = wasmExports["dc"])(a0, a1, a2, a3, a4); - -var dynCall_v = Module["dynCall_v"] = a0 => (dynCall_v = Module["dynCall_v"] = wasmExports["ec"])(a0); - -var dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = wasmExports["fc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_viiiiiii = Module["dynCall_viiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_viiiiiii = Module["dynCall_viiiiiii"] = wasmExports["gc"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_viiiiii = Module["dynCall_viiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_viiiiii = Module["dynCall_viiiiii"] = wasmExports["hc"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = wasmExports["ic"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = wasmExports["jc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_jii = Module["dynCall_jii"] = (a0, a1, a2) => (dynCall_jii = Module["dynCall_jii"] = wasmExports["kc"])(a0, a1, a2); - -var dynCall_viidii = Module["dynCall_viidii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viidii = Module["dynCall_viidii"] = wasmExports["lc"])(a0, a1, a2, a3, a4, a5); - -var _asyncify_start_unwind = a0 => (_asyncify_start_unwind = wasmExports["mc"])(a0); - -var _asyncify_stop_unwind = () => (_asyncify_stop_unwind = wasmExports["nc"])(); - -var _asyncify_start_rewind = a0 => (_asyncify_start_rewind = wasmExports["oc"])(a0); - -var _asyncify_stop_rewind = () => (_asyncify_stop_rewind = wasmExports["pc"])(); - -function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vi(index, a1) { - var sp = stackSave(); - try { - dynCall_vi(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_iii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - return dynCall_iiiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_ii(index, a1) { - var sp = stackSave(); - try { - return dynCall_ii(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiii(index, a1, a2, a3) { - var sp = stackSave(); - try { - return dynCall_iiii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - dynCall_viiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - return dynCall_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vii(index, a1, a2) { - var sp = stackSave(); - try { - dynCall_vii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_i(index) { - var sp = stackSave(); - try { - return dynCall_i(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viii(index, a1, a2, a3) { - var sp = stackSave(); - try { - dynCall_viii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_v(index) { - var sp = stackSave(); - try { - dynCall_v(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viidii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viidii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - return dynCall_iiiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - dynCall_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_jii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_jii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['Cb'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['Db'])(a0)); + + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['Eb'])(a0)); + + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['Fb'])(a0)); + + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = wasmExports['Gb'])( + a0 + )); + + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['Hb'])(a0)); + + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['Ib'])()); + + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['Jb'])()); + + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = wasmExports['Kb'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['Lb'])(a0)); + + var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports['Mb'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = wasmExports['Nb'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['Ob'])(a0, a1); + + var _setThrew = (a0, a1) => (_setThrew = wasmExports['Pb'])(a0, a1); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['Qb'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['Rb'])(a0); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['Sb'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = wasmExports['Tb'])(); + + var dynCall_iiii = (Module['dynCall_iiii'] = (a0, a1, a2, a3) => + (dynCall_iiii = Module['dynCall_iiii'] = wasmExports['Ub'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_ii = (Module['dynCall_ii'] = (a0, a1) => + (dynCall_ii = Module['dynCall_ii'] = wasmExports['Vb'])(a0, a1)); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['Wb'])(a0, a1)); + + var dynCall_vii = (Module['dynCall_vii'] = (a0, a1, a2) => + (dynCall_vii = Module['dynCall_vii'] = wasmExports['Xb'])(a0, a1, a2)); + + var dynCall_viiiii = (Module['dynCall_viiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viiiii = Module['dynCall_viiiii'] = wasmExports['Yb'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_iii = (Module['dynCall_iii'] = (a0, a1, a2) => + (dynCall_iii = Module['dynCall_iii'] = wasmExports['Zb'])(a0, a1, a2)); + + var dynCall_iiiii = (Module['dynCall_iiiii'] = (a0, a1, a2, a3, a4) => + (dynCall_iiiii = Module['dynCall_iiiii'] = wasmExports['_b'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iiiiiii = (Module['dynCall_iiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_iiiiiii = Module['dynCall_iiiiiii'] = wasmExports['$b'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_iiiiii = (Module['dynCall_iiiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_iiiiii = Module['dynCall_iiiiii'] = wasmExports['ac'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_i = (Module['dynCall_i'] = (a0) => + (dynCall_i = Module['dynCall_i'] = wasmExports['bc'])(a0)); + + var dynCall_viii = (Module['dynCall_viii'] = (a0, a1, a2, a3) => + (dynCall_viii = Module['dynCall_viii'] = wasmExports['cc'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_viiii = (Module['dynCall_viiii'] = (a0, a1, a2, a3, a4) => + (dynCall_viiii = Module['dynCall_viiii'] = wasmExports['dc'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_v = (Module['dynCall_v'] = (a0) => + (dynCall_v = Module['dynCall_v'] = wasmExports['ec'])(a0)); + + var dynCall_viiiiiiiii = (Module['dynCall_viiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_viiiiiiiii = Module['dynCall_viiiiiiiii'] = wasmExports['fc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_viiiiiii = (Module['dynCall_viiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_viiiiiii = Module['dynCall_viiiiiii'] = wasmExports['gc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_viiiiii = (Module['dynCall_viiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_viiiiii = Module['dynCall_viiiiii'] = wasmExports['hc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_iiiiiiii = (Module['dynCall_iiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_iiiiiiii = Module['dynCall_iiiiiiii'] = wasmExports['ic'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_iiiiiiiiii = (Module['dynCall_iiiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_iiiiiiiiii = Module['dynCall_iiiiiiiiii'] = wasmExports['jc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_jii = (Module['dynCall_jii'] = (a0, a1, a2) => + (dynCall_jii = Module['dynCall_jii'] = wasmExports['kc'])(a0, a1, a2)); + + var dynCall_viidii = (Module['dynCall_viidii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viidii = Module['dynCall_viidii'] = wasmExports['lc'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var _asyncify_start_unwind = (a0) => + (_asyncify_start_unwind = wasmExports['mc'])(a0); + + var _asyncify_stop_unwind = () => + (_asyncify_stop_unwind = wasmExports['nc'])(); + + var _asyncify_start_rewind = (a0) => + (_asyncify_start_rewind = wasmExports['oc'])(a0); + + var _asyncify_stop_rewind = () => + (_asyncify_stop_rewind = wasmExports['pc'])(); + + function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vi(index, a1) { + var sp = stackSave(); + try { + dynCall_vi(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_iii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + return dynCall_iiiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_ii(index, a1) { + var sp = stackSave(); + try { + return dynCall_ii(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiii(index, a1, a2, a3) { + var sp = stackSave(); + try { + return dynCall_iiii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + dynCall_viiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + return dynCall_iiiiiiiiii( + index, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vii(index, a1, a2) { + var sp = stackSave(); + try { + dynCall_vii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_i(index) { + var sp = stackSave(); + try { + return dynCall_i(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viii(index, a1, a2, a3) { + var sp = stackSave(); + try { + dynCall_viii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_v(index) { + var sp = stackSave(); + try { + dynCall_v(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viidii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viidii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + return dynCall_iiiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + dynCall_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_jii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_jii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/asyncify/php_8_1.js b/packages/php-wasm/node/asyncify/php_8_1.js index 8621c3042f..20e9a2ee40 100644 --- a/packages/php-wasm/node/asyncify/php_8_1.js +++ b/packages/php-wasm/node/asyncify/php_8_1.js @@ -1,6659 +1,7709 @@ -const dependencyFilename = __dirname + '/8_1_23/php_8_1.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 14446072; +const dependencyFilename = __dirname + '/8_1_23/php_8_1.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 14446072; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - return { - "a": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["gb"]; - updateMemoryViews(); - wasmTable = wasmExports["jb"]; - addOnInit(wasmExports["hb"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function js_popen_to_file(command, mode, exitCodePtr) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); -} - -function wasm_poll_socket(socketd, events, timeout) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); -} - -function js_fd_read(fd, iov, iovcnt, pnum) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); -} - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var stackRestore = val => __emscripten_stack_restore(val); - -var stackSave = () => _emscripten_stack_get_current(); - -/** @type {function(...*):?} */ function _SharpYuvConvert() { - abort("missing function: SharpYuvConvert"); -} - -_SharpYuvConvert.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { - abort("missing function: SharpYuvGetConversionMatrix"); -} - -_SharpYuvGetConversionMatrix.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvInit() { - abort("missing function: SharpYuvInit"); -} - -_SharpYuvInit.stub = true; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_fallocate(fd, mode, offset_low, offset_high, len_low, len_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - var len = convertI32PairToI53Checked(len_low, len_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.allocate(stream, offset, len); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fdatasync(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -var __emscripten_throw_longjmp = () => { - throw Infinity; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -/** @type {function(...*):?} */ function _getcontext() { - abort("missing function: getcontext"); -} - -_getcontext.stub = true; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -/** @type {function(...*):?} */ function _makecontext() { - abort("missing function: makecontext"); -} - -_makecontext.stub = true; - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + return { + a: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['gb']; + updateMemoryViews(); + wasmTable = wasmExports['jb']; + addOnInit(wasmExports['hb']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function js_popen_to_file(command, mode, exitCodePtr) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce((acc, curr) => acc + curr.length, 0) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + } + + function wasm_poll_socket(socketd, events, timeout) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + } + + function js_fd_read(fd, iov, iovcnt, pnum) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + } + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + /** @type {function(...*):?} */ function _SharpYuvConvert() { + abort('missing function: SharpYuvConvert'); + } + + _SharpYuvConvert.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { + abort('missing function: SharpYuvGetConversionMatrix'); + } + + _SharpYuvGetConversionMatrix.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvInit() { + abort('missing function: SharpYuvInit'); + } + + _SharpYuvInit.stub = true; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_fallocate( + fd, + mode, + offset_low, + offset_high, + len_low, + len_high + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + var len = convertI32PairToI53Checked(len_low, len_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.allocate(stream, offset, len); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fdatasync(fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + var __emscripten_throw_longjmp = () => { + throw Infinity; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + /** @type {function(...*):?} */ function _getcontext() { + abort('missing function: getcontext'); + } + + _getcontext.stub = true; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + /** @type {function(...*):?} */ function _makecontext() { + abort('missing function: makecontext'); + } + + _makecontext.stub = true; + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6664,922 +7714,1238 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -/** @type {function(...*):?} */ function _swapcontext() { - abort("missing function: swapcontext"); -} - -_swapcontext.stub = true; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -function _wasm_shutdown(socketd, how) { - return PHPWASM.shutdownSocket(socketd, how); -} - -/** @type {WebAssembly.Table} */ var wasmTable; - -var runAndAbortIfError = func => { - try { - return func(); - } catch (e) { - abort(e); - } -}; - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - } - } - }, - instrumentWasmExports(exports) { - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - ret[x] = (...args) => { - Asyncify.exportCallStack.push(x); - try { - return original(...args); - } finally { - if (!ABORT) { - var y = Asyncify.exportCallStack.pop(); - Asyncify.maybeStopUnwind(); - } - } - }; - } else { - ret[x] = original; - } - } - return ret; - }, - State: { - Normal: 0, - Unwinding: 1, - Rewinding: 2, - Disabled: 3 - }, - state: 0, - StackSize: 4096, - currData: null, - handleSleepReturnValue: 0, - exportCallStack: [], - callStackNameToId: {}, - callStackIdToName: {}, - callStackId: 0, - asyncPromiseHandlers: null, - sleepCallbacks: [], - getCallStackId(funcName) { - var id = Asyncify.callStackNameToId[funcName]; - if (id === undefined) { - id = Asyncify.callStackId++; - Asyncify.callStackNameToId[funcName] = id; - Asyncify.callStackIdToName[id] = funcName; - } - return id; - }, - maybeStopUnwind() { - if (Asyncify.currData && Asyncify.state === Asyncify.State.Unwinding && Asyncify.exportCallStack.length === 0) { - Asyncify.state = Asyncify.State.Normal; - runtimeKeepalivePush(); - runAndAbortIfError(_asyncify_stop_unwind); - if (typeof Fibers != "undefined") { - Fibers.trampoline(); - } - } - }, - whenDone() { - return new Promise((resolve, reject) => { - Asyncify.asyncPromiseHandlers = { - resolve: resolve, - reject: 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)] = stack; - HEAPU32[(((ptr) + (4)) >> 2)] = stack + stackSize; - }, - setDataRewindFunc(ptr) { - var bottomOfCallStack = Asyncify.exportCallStack[0]; - var rewindId = Asyncify.getCallStackId(bottomOfCallStack); - HEAP32[(((ptr) + (8)) >> 2)] = rewindId; - }, - getDataRewindFuncName(ptr) { - var id = HEAP32[(((ptr) + (8)) >> 2)]; - var name = Asyncify.callStackIdToName[id]; - return name; - }, - getDataRewindFunc(name) { - var func = wasmExports[name]; - return func; - }, - doRewind(ptr) { - var name = Asyncify.getDataRewindFuncName(ptr); - var func = Asyncify.getDataRewindFunc(name); - runtimeKeepalivePop(); - return 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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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) { - return Asyncify.handleSleep(wakeUp => { - startAsync().then(wakeUp); - }); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var previousAsync = Asyncify.currData; - var ret = func(...cArgs); - function onDone(ret) { - runtimeKeepalivePop(); - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - runtimeKeepalivePush(); - if (Asyncify.currData != previousAsync) { - return Asyncify.whenDone().then(onDone); - } - ret = onDone(ret); - if (asyncMode) return Promise.resolve(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ fb: _SharpYuvConvert, - /** @export */ eb: _SharpYuvGetConversionMatrix, - /** @export */ db: _SharpYuvInit, - /** @export */ n: ___assert_fail, - /** @export */ _: __asyncjs__js_module_onMessage, - /** @export */ cb: ___call_sighandler, - /** @export */ bb: ___syscall_accept4, - /** @export */ ab: ___syscall_bind, - /** @export */ $a: ___syscall_chdir, - /** @export */ Q: ___syscall_chmod, - /** @export */ _a: ___syscall_connect, - /** @export */ Za: ___syscall_dup, - /** @export */ Ya: ___syscall_dup3, - /** @export */ Xa: ___syscall_faccessat, - /** @export */ ea: ___syscall_fallocate, - /** @export */ Wa: ___syscall_fchmod, - /** @export */ Va: ___syscall_fchown32, - /** @export */ P: ___syscall_fchownat, - /** @export */ m: ___syscall_fcntl64, - /** @export */ Ua: ___syscall_fdatasync, - /** @export */ Ta: ___syscall_fstat64, - /** @export */ la: ___syscall_ftruncate64, - /** @export */ Sa: ___syscall_getcwd, - /** @export */ Ra: ___syscall_getdents64, - /** @export */ Qa: ___syscall_getpeername, - /** @export */ Pa: ___syscall_getsockname, - /** @export */ Oa: ___syscall_getsockopt, - /** @export */ E: ___syscall_ioctl, - /** @export */ Na: ___syscall_listen, - /** @export */ Ma: ___syscall_lstat64, - /** @export */ La: ___syscall_mkdirat, - /** @export */ Ka: ___syscall_newfstatat, - /** @export */ y: ___syscall_openat, - /** @export */ Ja: ___syscall_pipe, - /** @export */ Ia: ___syscall_poll, - /** @export */ Ha: ___syscall_readlinkat, - /** @export */ Ga: ___syscall_recvfrom, - /** @export */ Fa: ___syscall_renameat, - /** @export */ O: ___syscall_rmdir, - /** @export */ Ea: ___syscall_sendto, - /** @export */ N: ___syscall_socket, - /** @export */ Da: ___syscall_stat64, - /** @export */ Ca: ___syscall_statfs64, - /** @export */ Ba: ___syscall_symlink, - /** @export */ D: ___syscall_unlinkat, - /** @export */ Aa: ___syscall_utimensat, - /** @export */ va: __abort_js, - /** @export */ ua: __emscripten_get_now_is_monotonic, - /** @export */ ta: __emscripten_lookup_name, - /** @export */ sa: __emscripten_memcpy_js, - /** @export */ ra: __emscripten_runtime_keepalive_clear, - /** @export */ qa: __emscripten_throw_longjmp, - /** @export */ ha: __gmtime_js, - /** @export */ ia: __localtime_js, - /** @export */ ja: __mktime_js, - /** @export */ fa: __mmap_js, - /** @export */ ga: __munmap_js, - /** @export */ K: __setitimer_js, - /** @export */ pa: __tzset_js, - /** @export */ B: _emscripten_date_now, - /** @export */ oa: _emscripten_get_heap_max, - /** @export */ v: _emscripten_get_now, - /** @export */ na: _emscripten_resize_heap, - /** @export */ J: _emscripten_sleep, - /** @export */ za: _environ_get, - /** @export */ ya: _environ_sizes_get, - /** @export */ q: _exit, - /** @export */ r: _fd_close, - /** @export */ M: _fd_fdstat_get, - /** @export */ L: _fd_read, - /** @export */ ka: _fd_seek, - /** @export */ xa: _fd_sync, - /** @export */ C: _fd_write, - /** @export */ I: _getaddrinfo, - /** @export */ da: _getcontext, - /** @export */ x: _getnameinfo, - /** @export */ ca: _getprotobyname, - /** @export */ ba: _getprotobynumber, - /** @export */ i: invoke_i, - /** @export */ c: invoke_ii, - /** @export */ b: invoke_iii, - /** @export */ g: invoke_iiii, - /** @export */ h: invoke_iiiii, - /** @export */ p: invoke_iiiiii, - /** @export */ s: invoke_iiiiiii, - /** @export */ w: invoke_iiiiiiii, - /** @export */ H: invoke_iiiiiiiiii, - /** @export */ ma: invoke_jii, - /** @export */ e: invoke_v, - /** @export */ a: invoke_vi, - /** @export */ d: invoke_vii, - /** @export */ A: invoke_viidii, - /** @export */ f: invoke_viii, - /** @export */ j: invoke_viiii, - /** @export */ l: invoke_viiiii, - /** @export */ k: invoke_viiiiii, - /** @export */ aa: invoke_viiiiiii, - /** @export */ z: invoke_viiiiiiiii, - /** @export */ G: _js_create_input_device, - /** @export */ $: js_fd_read, - /** @export */ F: _js_open_process, - /** @export */ Z: js_popen_to_file, - /** @export */ Y: _js_process_status, - /** @export */ X: _js_waitpid, - /** @export */ W: _makecontext, - /** @export */ wa: _proc_exit, - /** @export */ V: _strftime, - /** @export */ U: _strftime_l, - /** @export */ T: _strptime, - /** @export */ S: _swapcontext, - /** @export */ t: _wasm_close, - /** @export */ u: wasm_poll_socket, - /** @export */ o: _wasm_setsockopt, - /** @export */ R: _wasm_shutdown -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["hb"])(); - -var _free = a0 => (_free = wasmExports["ib"])(a0); - -var _malloc = a0 => (_malloc = wasmExports["kb"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["lb"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["mb"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["nb"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["ob"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["pb"])(a0, a1, a2); - -var _htons = a0 => (_htons = wasmExports["qb"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["rb"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["sb"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["tb"])(a0); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["ub"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["vb"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["wb"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["xb"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["yb"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["zb"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["Ab"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["Bb"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["Cb"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["Db"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["Eb"])(a0); - -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["Fb"])(a0); - -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["Gb"])(a0); - -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["Hb"])(a0); - -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["Ib"])(a0); - -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["Jb"])(a0); - -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["Kb"])(a0); - -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["Lb"])(a0); - -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["Mb"])(); - -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["Nb"])(); - -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["Ob"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["Pb"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["Qb"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["Rb"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["Sb"])(a0, a1); - -var _setThrew = (a0, a1) => (_setThrew = wasmExports["Tb"])(a0, a1); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["Ub"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["Vb"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["Wb"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["Xb"])(); - -var dynCall_iiii = Module["dynCall_iiii"] = (a0, a1, a2, a3) => (dynCall_iiii = Module["dynCall_iiii"] = wasmExports["Yb"])(a0, a1, a2, a3); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + /** @type {function(...*):?} */ function _swapcontext() { + abort('missing function: swapcontext'); + } + + _swapcontext.stub = true; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + function _wasm_shutdown(socketd, how) { + return PHPWASM.shutdownSocket(socketd, how); + } + + /** @type {WebAssembly.Table} */ var wasmTable; + + var runAndAbortIfError = (func) => { + try { + return func(); + } catch (e) { + abort(e); + } + }; + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + } + } + }, + instrumentWasmExports(exports) { + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + ret[x] = (...args) => { + Asyncify.exportCallStack.push(x); + try { + return original(...args); + } finally { + if (!ABORT) { + var y = Asyncify.exportCallStack.pop(); + Asyncify.maybeStopUnwind(); + } + } + }; + } else { + ret[x] = original; + } + } + return ret; + }, + State: { + Normal: 0, + Unwinding: 1, + Rewinding: 2, + Disabled: 3, + }, + state: 0, + StackSize: 4096, + currData: null, + handleSleepReturnValue: 0, + exportCallStack: [], + callStackNameToId: {}, + callStackIdToName: {}, + callStackId: 0, + asyncPromiseHandlers: null, + sleepCallbacks: [], + getCallStackId(funcName) { + var id = Asyncify.callStackNameToId[funcName]; + if (id === undefined) { + id = Asyncify.callStackId++; + Asyncify.callStackNameToId[funcName] = id; + Asyncify.callStackIdToName[id] = funcName; + } + return id; + }, + maybeStopUnwind() { + if ( + Asyncify.currData && + Asyncify.state === Asyncify.State.Unwinding && + Asyncify.exportCallStack.length === 0 + ) { + Asyncify.state = Asyncify.State.Normal; + runtimeKeepalivePush(); + runAndAbortIfError(_asyncify_stop_unwind); + if (typeof Fibers != 'undefined') { + Fibers.trampoline(); + } + } + }, + whenDone() { + return new Promise((resolve, reject) => { + Asyncify.asyncPromiseHandlers = { + resolve: resolve, + reject: 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] = stack; + HEAPU32[(ptr + 4) >> 2] = stack + stackSize; + }, + setDataRewindFunc(ptr) { + var bottomOfCallStack = Asyncify.exportCallStack[0]; + var rewindId = Asyncify.getCallStackId(bottomOfCallStack); + HEAP32[(ptr + 8) >> 2] = rewindId; + }, + getDataRewindFuncName(ptr) { + var id = HEAP32[(ptr + 8) >> 2]; + var name = Asyncify.callStackIdToName[id]; + return name; + }, + getDataRewindFunc(name) { + var func = wasmExports[name]; + return func; + }, + doRewind(ptr) { + var name = Asyncify.getDataRewindFuncName(ptr); + var func = Asyncify.getDataRewindFunc(name); + runtimeKeepalivePop(); + return 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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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) { + return Asyncify.handleSleep((wakeUp) => { + startAsync().then(wakeUp); + }); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var previousAsync = Asyncify.currData; + var ret = func(...cArgs); + function onDone(ret) { + runtimeKeepalivePop(); + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + runtimeKeepalivePush(); + if (Asyncify.currData != previousAsync) { + return Asyncify.whenDone().then(onDone); + } + ret = onDone(ret); + if (asyncMode) return Promise.resolve(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ fb: _SharpYuvConvert, + /** @export */ eb: _SharpYuvGetConversionMatrix, + /** @export */ db: _SharpYuvInit, + /** @export */ n: ___assert_fail, + /** @export */ _: __asyncjs__js_module_onMessage, + /** @export */ cb: ___call_sighandler, + /** @export */ bb: ___syscall_accept4, + /** @export */ ab: ___syscall_bind, + /** @export */ $a: ___syscall_chdir, + /** @export */ Q: ___syscall_chmod, + /** @export */ _a: ___syscall_connect, + /** @export */ Za: ___syscall_dup, + /** @export */ Ya: ___syscall_dup3, + /** @export */ Xa: ___syscall_faccessat, + /** @export */ ea: ___syscall_fallocate, + /** @export */ Wa: ___syscall_fchmod, + /** @export */ Va: ___syscall_fchown32, + /** @export */ P: ___syscall_fchownat, + /** @export */ m: ___syscall_fcntl64, + /** @export */ Ua: ___syscall_fdatasync, + /** @export */ Ta: ___syscall_fstat64, + /** @export */ la: ___syscall_ftruncate64, + /** @export */ Sa: ___syscall_getcwd, + /** @export */ Ra: ___syscall_getdents64, + /** @export */ Qa: ___syscall_getpeername, + /** @export */ Pa: ___syscall_getsockname, + /** @export */ Oa: ___syscall_getsockopt, + /** @export */ E: ___syscall_ioctl, + /** @export */ Na: ___syscall_listen, + /** @export */ Ma: ___syscall_lstat64, + /** @export */ La: ___syscall_mkdirat, + /** @export */ Ka: ___syscall_newfstatat, + /** @export */ y: ___syscall_openat, + /** @export */ Ja: ___syscall_pipe, + /** @export */ Ia: ___syscall_poll, + /** @export */ Ha: ___syscall_readlinkat, + /** @export */ Ga: ___syscall_recvfrom, + /** @export */ Fa: ___syscall_renameat, + /** @export */ O: ___syscall_rmdir, + /** @export */ Ea: ___syscall_sendto, + /** @export */ N: ___syscall_socket, + /** @export */ Da: ___syscall_stat64, + /** @export */ Ca: ___syscall_statfs64, + /** @export */ Ba: ___syscall_symlink, + /** @export */ D: ___syscall_unlinkat, + /** @export */ Aa: ___syscall_utimensat, + /** @export */ va: __abort_js, + /** @export */ ua: __emscripten_get_now_is_monotonic, + /** @export */ ta: __emscripten_lookup_name, + /** @export */ sa: __emscripten_memcpy_js, + /** @export */ ra: __emscripten_runtime_keepalive_clear, + /** @export */ qa: __emscripten_throw_longjmp, + /** @export */ ha: __gmtime_js, + /** @export */ ia: __localtime_js, + /** @export */ ja: __mktime_js, + /** @export */ fa: __mmap_js, + /** @export */ ga: __munmap_js, + /** @export */ K: __setitimer_js, + /** @export */ pa: __tzset_js, + /** @export */ B: _emscripten_date_now, + /** @export */ oa: _emscripten_get_heap_max, + /** @export */ v: _emscripten_get_now, + /** @export */ na: _emscripten_resize_heap, + /** @export */ J: _emscripten_sleep, + /** @export */ za: _environ_get, + /** @export */ ya: _environ_sizes_get, + /** @export */ q: _exit, + /** @export */ r: _fd_close, + /** @export */ M: _fd_fdstat_get, + /** @export */ L: _fd_read, + /** @export */ ka: _fd_seek, + /** @export */ xa: _fd_sync, + /** @export */ C: _fd_write, + /** @export */ I: _getaddrinfo, + /** @export */ da: _getcontext, + /** @export */ x: _getnameinfo, + /** @export */ ca: _getprotobyname, + /** @export */ ba: _getprotobynumber, + /** @export */ i: invoke_i, + /** @export */ c: invoke_ii, + /** @export */ b: invoke_iii, + /** @export */ g: invoke_iiii, + /** @export */ h: invoke_iiiii, + /** @export */ p: invoke_iiiiii, + /** @export */ s: invoke_iiiiiii, + /** @export */ w: invoke_iiiiiiii, + /** @export */ H: invoke_iiiiiiiiii, + /** @export */ ma: invoke_jii, + /** @export */ e: invoke_v, + /** @export */ a: invoke_vi, + /** @export */ d: invoke_vii, + /** @export */ A: invoke_viidii, + /** @export */ f: invoke_viii, + /** @export */ j: invoke_viiii, + /** @export */ l: invoke_viiiii, + /** @export */ k: invoke_viiiiii, + /** @export */ aa: invoke_viiiiiii, + /** @export */ z: invoke_viiiiiiiii, + /** @export */ G: _js_create_input_device, + /** @export */ $: js_fd_read, + /** @export */ F: _js_open_process, + /** @export */ Z: js_popen_to_file, + /** @export */ Y: _js_process_status, + /** @export */ X: _js_waitpid, + /** @export */ W: _makecontext, + /** @export */ wa: _proc_exit, + /** @export */ V: _strftime, + /** @export */ U: _strftime_l, + /** @export */ T: _strptime, + /** @export */ S: _swapcontext, + /** @export */ t: _wasm_close, + /** @export */ u: wasm_poll_socket, + /** @export */ o: _wasm_setsockopt, + /** @export */ R: _wasm_shutdown, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports['hb'])(); + + var _free = (a0) => (_free = wasmExports['ib'])(a0); + + var _malloc = (a0) => (_malloc = wasmExports['kb'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['lb'])(a0, a1, a2)); + + var _fflush = (a0) => (_fflush = wasmExports['mb'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['nb'])(a0, a1)); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = wasmExports['ob'])( + a0, + a1, + a2, + a3 + )); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = wasmExports['pb'])( + a0, + a1, + a2 + )); + + var _htons = (a0) => (_htons = wasmExports['qb'])(a0); + + var _ntohs = (a0) => (_ntohs = wasmExports['rb'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['sb'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['tb'])(a0)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = wasmExports['ub'])( + a0, + a1, + a2, + a3, + a4 + )); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = wasmExports['vb'])( + a0 + )); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['wb'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['xb'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['yb'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['zb'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['Ab'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['Bb'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['Cb'])(a0)); + + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['Db'])(a0)); + + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['Eb'])(a0)); -var dynCall_ii = Module["dynCall_ii"] = (a0, a1) => (dynCall_ii = Module["dynCall_ii"] = wasmExports["Zb"])(a0, a1); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['Fb'])(a0)); -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["_b"])(a0, a1); - -var dynCall_vii = Module["dynCall_vii"] = (a0, a1, a2) => (dynCall_vii = Module["dynCall_vii"] = wasmExports["$b"])(a0, a1, a2); - -var dynCall_viiiii = Module["dynCall_viiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viiiii = Module["dynCall_viiiii"] = wasmExports["ac"])(a0, a1, a2, a3, a4, a5); - -var dynCall_iii = Module["dynCall_iii"] = (a0, a1, a2) => (dynCall_iii = Module["dynCall_iii"] = wasmExports["bc"])(a0, a1, a2); - -var dynCall_iiiii = Module["dynCall_iiiii"] = (a0, a1, a2, a3, a4) => (dynCall_iiiii = Module["dynCall_iiiii"] = wasmExports["cc"])(a0, a1, a2, a3, a4); - -var dynCall_iiiiii = Module["dynCall_iiiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_iiiiii = Module["dynCall_iiiiii"] = wasmExports["dc"])(a0, a1, a2, a3, a4, a5); - -var dynCall_viii = Module["dynCall_viii"] = (a0, a1, a2, a3) => (dynCall_viii = Module["dynCall_viii"] = wasmExports["ec"])(a0, a1, a2, a3); - -var dynCall_v = Module["dynCall_v"] = a0 => (dynCall_v = Module["dynCall_v"] = wasmExports["fc"])(a0); - -var dynCall_i = Module["dynCall_i"] = a0 => (dynCall_i = Module["dynCall_i"] = wasmExports["gc"])(a0); - -var dynCall_viiii = Module["dynCall_viiii"] = (a0, a1, a2, a3, a4) => (dynCall_viiii = Module["dynCall_viiii"] = wasmExports["hc"])(a0, a1, a2, a3, a4); - -var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_iiiiiii = Module["dynCall_iiiiiii"] = wasmExports["ic"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = wasmExports["jc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_viiiiiii = Module["dynCall_viiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_viiiiiii = Module["dynCall_viiiiiii"] = wasmExports["kc"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_viiiiii = Module["dynCall_viiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_viiiiii = Module["dynCall_viiiiii"] = wasmExports["lc"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = wasmExports["mc"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = wasmExports["nc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_jii = Module["dynCall_jii"] = (a0, a1, a2) => (dynCall_jii = Module["dynCall_jii"] = wasmExports["oc"])(a0, a1, a2); - -var dynCall_viidii = Module["dynCall_viidii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viidii = Module["dynCall_viidii"] = wasmExports["pc"])(a0, a1, a2, a3, a4, a5); - -var _asyncify_start_unwind = a0 => (_asyncify_start_unwind = wasmExports["qc"])(a0); - -var _asyncify_stop_unwind = () => (_asyncify_stop_unwind = wasmExports["rc"])(); - -var _asyncify_start_rewind = a0 => (_asyncify_start_rewind = wasmExports["sc"])(a0); - -var _asyncify_stop_rewind = () => (_asyncify_stop_rewind = wasmExports["tc"])(); - -function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vi(index, a1) { - var sp = stackSave(); - try { - dynCall_vi(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiii(index, a1, a2, a3) { - var sp = stackSave(); - try { - return dynCall_iiii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_iii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vii(index, a1, a2) { - var sp = stackSave(); - try { - dynCall_vii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_ii(index, a1) { - var sp = stackSave(); - try { - return dynCall_ii(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viii(index, a1, a2, a3) { - var sp = stackSave(); - try { - dynCall_viii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_v(index) { - var sp = stackSave(); - try { - dynCall_v(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_i(index) { - var sp = stackSave(); - try { - return dynCall_i(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - dynCall_viiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - return dynCall_iiiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - return dynCall_iiiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - return dynCall_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viidii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viidii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - dynCall_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_jii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_jii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['Gb'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['Hb'])(a0)); + + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['Ib'])(a0)); + + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['Jb'])(a0)); + + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = wasmExports['Kb'])( + a0 + )); + + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['Lb'])(a0)); + + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['Mb'])()); + + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['Nb'])()); + + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = wasmExports['Ob'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['Pb'])(a0)); + + var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports['Qb'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = wasmExports['Rb'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['Sb'])(a0, a1); + + var _setThrew = (a0, a1) => (_setThrew = wasmExports['Tb'])(a0, a1); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['Ub'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['Vb'])(a0); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['Wb'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = wasmExports['Xb'])(); + + var dynCall_iiii = (Module['dynCall_iiii'] = (a0, a1, a2, a3) => + (dynCall_iiii = Module['dynCall_iiii'] = wasmExports['Yb'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_ii = (Module['dynCall_ii'] = (a0, a1) => + (dynCall_ii = Module['dynCall_ii'] = wasmExports['Zb'])(a0, a1)); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['_b'])(a0, a1)); + + var dynCall_vii = (Module['dynCall_vii'] = (a0, a1, a2) => + (dynCall_vii = Module['dynCall_vii'] = wasmExports['$b'])(a0, a1, a2)); + + var dynCall_viiiii = (Module['dynCall_viiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viiiii = Module['dynCall_viiiii'] = wasmExports['ac'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_iii = (Module['dynCall_iii'] = (a0, a1, a2) => + (dynCall_iii = Module['dynCall_iii'] = wasmExports['bc'])(a0, a1, a2)); + + var dynCall_iiiii = (Module['dynCall_iiiii'] = (a0, a1, a2, a3, a4) => + (dynCall_iiiii = Module['dynCall_iiiii'] = wasmExports['cc'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iiiiii = (Module['dynCall_iiiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_iiiiii = Module['dynCall_iiiiii'] = wasmExports['dc'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_viii = (Module['dynCall_viii'] = (a0, a1, a2, a3) => + (dynCall_viii = Module['dynCall_viii'] = wasmExports['ec'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_v = (Module['dynCall_v'] = (a0) => + (dynCall_v = Module['dynCall_v'] = wasmExports['fc'])(a0)); + + var dynCall_i = (Module['dynCall_i'] = (a0) => + (dynCall_i = Module['dynCall_i'] = wasmExports['gc'])(a0)); + + var dynCall_viiii = (Module['dynCall_viiii'] = (a0, a1, a2, a3, a4) => + (dynCall_viiii = Module['dynCall_viiii'] = wasmExports['hc'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iiiiiii = (Module['dynCall_iiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_iiiiiii = Module['dynCall_iiiiiii'] = wasmExports['ic'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_viiiiiiiii = (Module['dynCall_viiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_viiiiiiiii = Module['dynCall_viiiiiiiii'] = wasmExports['jc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_viiiiiii = (Module['dynCall_viiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_viiiiiii = Module['dynCall_viiiiiii'] = wasmExports['kc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_viiiiii = (Module['dynCall_viiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_viiiiii = Module['dynCall_viiiiii'] = wasmExports['lc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_iiiiiiii = (Module['dynCall_iiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_iiiiiiii = Module['dynCall_iiiiiiii'] = wasmExports['mc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_iiiiiiiiii = (Module['dynCall_iiiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_iiiiiiiiii = Module['dynCall_iiiiiiiiii'] = wasmExports['nc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_jii = (Module['dynCall_jii'] = (a0, a1, a2) => + (dynCall_jii = Module['dynCall_jii'] = wasmExports['oc'])(a0, a1, a2)); + + var dynCall_viidii = (Module['dynCall_viidii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viidii = Module['dynCall_viidii'] = wasmExports['pc'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var _asyncify_start_unwind = (a0) => + (_asyncify_start_unwind = wasmExports['qc'])(a0); + + var _asyncify_stop_unwind = () => + (_asyncify_stop_unwind = wasmExports['rc'])(); + + var _asyncify_start_rewind = (a0) => + (_asyncify_start_rewind = wasmExports['sc'])(a0); + + var _asyncify_stop_rewind = () => + (_asyncify_stop_rewind = wasmExports['tc'])(); + + function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vi(index, a1) { + var sp = stackSave(); + try { + dynCall_vi(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiii(index, a1, a2, a3) { + var sp = stackSave(); + try { + return dynCall_iiii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_iii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vii(index, a1, a2) { + var sp = stackSave(); + try { + dynCall_vii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_ii(index, a1) { + var sp = stackSave(); + try { + return dynCall_ii(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viii(index, a1, a2, a3) { + var sp = stackSave(); + try { + dynCall_viii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_v(index) { + var sp = stackSave(); + try { + dynCall_v(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_i(index) { + var sp = stackSave(); + try { + return dynCall_i(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + dynCall_viiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + return dynCall_iiiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + return dynCall_iiiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + return dynCall_iiiiiiiiii( + index, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viidii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viidii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + dynCall_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_jii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_jii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/asyncify/php_8_2.js b/packages/php-wasm/node/asyncify/php_8_2.js index ee7eafd5a6..59c4a89a23 100644 --- a/packages/php-wasm/node/asyncify/php_8_2.js +++ b/packages/php-wasm/node/asyncify/php_8_2.js @@ -1,6665 +1,7715 @@ -const dependencyFilename = __dirname + '/8_2_10/php_8_2.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 14701538; +const dependencyFilename = __dirname + '/8_2_10/php_8_2.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 14701538; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - return { - "a": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["hb"]; - updateMemoryViews(); - wasmTable = wasmExports["kb"]; - addOnInit(wasmExports["ib"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function js_popen_to_file(command, mode, exitCodePtr) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); -} - -function wasm_poll_socket(socketd, events, timeout) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); -} - -function js_fd_read(fd, iov, iovcnt, pnum) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); -} - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var stackRestore = val => __emscripten_stack_restore(val); - -var stackSave = () => _emscripten_stack_get_current(); - -/** @type {function(...*):?} */ function _SharpYuvConvert() { - abort("missing function: SharpYuvConvert"); -} - -_SharpYuvConvert.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { - abort("missing function: SharpYuvGetConversionMatrix"); -} - -_SharpYuvGetConversionMatrix.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvInit() { - abort("missing function: SharpYuvInit"); -} - -_SharpYuvInit.stub = true; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_fallocate(fd, mode, offset_low, offset_high, len_low, len_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - var len = convertI32PairToI53Checked(len_low, len_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.allocate(stream, offset, len); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fdatasync(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -var __emscripten_throw_longjmp = () => { - throw Infinity; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -/** @type {function(...*):?} */ function _getcontext() { - abort("missing function: getcontext"); -} - -_getcontext.stub = true; - -/** @type {function(...*):?} */ function _getdtablesize() { - abort("missing function: getdtablesize"); -} - -_getdtablesize.stub = true; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -/** @type {function(...*):?} */ function _makecontext() { - abort("missing function: makecontext"); -} - -_makecontext.stub = true; - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + return { + a: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['hb']; + updateMemoryViews(); + wasmTable = wasmExports['kb']; + addOnInit(wasmExports['ib']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function js_popen_to_file(command, mode, exitCodePtr) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce((acc, curr) => acc + curr.length, 0) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + } + + function wasm_poll_socket(socketd, events, timeout) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + } + + function js_fd_read(fd, iov, iovcnt, pnum) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + } + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + /** @type {function(...*):?} */ function _SharpYuvConvert() { + abort('missing function: SharpYuvConvert'); + } + + _SharpYuvConvert.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { + abort('missing function: SharpYuvGetConversionMatrix'); + } + + _SharpYuvGetConversionMatrix.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvInit() { + abort('missing function: SharpYuvInit'); + } + + _SharpYuvInit.stub = true; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_fallocate( + fd, + mode, + offset_low, + offset_high, + len_low, + len_high + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + var len = convertI32PairToI53Checked(len_low, len_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.allocate(stream, offset, len); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fdatasync(fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + var __emscripten_throw_longjmp = () => { + throw Infinity; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + /** @type {function(...*):?} */ function _getcontext() { + abort('missing function: getcontext'); + } + + _getcontext.stub = true; + + /** @type {function(...*):?} */ function _getdtablesize() { + abort('missing function: getdtablesize'); + } + + _getdtablesize.stub = true; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + /** @type {function(...*):?} */ function _makecontext() { + abort('missing function: makecontext'); + } + + _makecontext.stub = true; + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6670,923 +7720,1239 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -/** @type {function(...*):?} */ function _swapcontext() { - abort("missing function: swapcontext"); -} - -_swapcontext.stub = true; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -function _wasm_shutdown(socketd, how) { - return PHPWASM.shutdownSocket(socketd, how); -} - -/** @type {WebAssembly.Table} */ var wasmTable; - -var runAndAbortIfError = func => { - try { - return func(); - } catch (e) { - abort(e); - } -}; - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - } - } - }, - instrumentWasmExports(exports) { - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - ret[x] = (...args) => { - Asyncify.exportCallStack.push(x); - try { - return original(...args); - } finally { - if (!ABORT) { - var y = Asyncify.exportCallStack.pop(); - Asyncify.maybeStopUnwind(); - } - } - }; - } else { - ret[x] = original; - } - } - return ret; - }, - State: { - Normal: 0, - Unwinding: 1, - Rewinding: 2, - Disabled: 3 - }, - state: 0, - StackSize: 4096, - currData: null, - handleSleepReturnValue: 0, - exportCallStack: [], - callStackNameToId: {}, - callStackIdToName: {}, - callStackId: 0, - asyncPromiseHandlers: null, - sleepCallbacks: [], - getCallStackId(funcName) { - var id = Asyncify.callStackNameToId[funcName]; - if (id === undefined) { - id = Asyncify.callStackId++; - Asyncify.callStackNameToId[funcName] = id; - Asyncify.callStackIdToName[id] = funcName; - } - return id; - }, - maybeStopUnwind() { - if (Asyncify.currData && Asyncify.state === Asyncify.State.Unwinding && Asyncify.exportCallStack.length === 0) { - Asyncify.state = Asyncify.State.Normal; - runtimeKeepalivePush(); - runAndAbortIfError(_asyncify_stop_unwind); - if (typeof Fibers != "undefined") { - Fibers.trampoline(); - } - } - }, - whenDone() { - return new Promise((resolve, reject) => { - Asyncify.asyncPromiseHandlers = { - resolve: resolve, - reject: 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)] = stack; - HEAPU32[(((ptr) + (4)) >> 2)] = stack + stackSize; - }, - setDataRewindFunc(ptr) { - var bottomOfCallStack = Asyncify.exportCallStack[0]; - var rewindId = Asyncify.getCallStackId(bottomOfCallStack); - HEAP32[(((ptr) + (8)) >> 2)] = rewindId; - }, - getDataRewindFuncName(ptr) { - var id = HEAP32[(((ptr) + (8)) >> 2)]; - var name = Asyncify.callStackIdToName[id]; - return name; - }, - getDataRewindFunc(name) { - var func = wasmExports[name]; - return func; - }, - doRewind(ptr) { - var name = Asyncify.getDataRewindFuncName(ptr); - var func = Asyncify.getDataRewindFunc(name); - runtimeKeepalivePop(); - return 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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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) { - return Asyncify.handleSleep(wakeUp => { - startAsync().then(wakeUp); - }); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var previousAsync = Asyncify.currData; - var ret = func(...cArgs); - function onDone(ret) { - runtimeKeepalivePop(); - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - runtimeKeepalivePush(); - if (Asyncify.currData != previousAsync) { - return Asyncify.whenDone().then(onDone); - } - ret = onDone(ret); - if (asyncMode) return Promise.resolve(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ gb: _SharpYuvConvert, - /** @export */ fb: _SharpYuvGetConversionMatrix, - /** @export */ eb: _SharpYuvInit, - /** @export */ n: ___assert_fail, - /** @export */ _: __asyncjs__js_module_onMessage, - /** @export */ db: ___call_sighandler, - /** @export */ cb: ___syscall_accept4, - /** @export */ bb: ___syscall_bind, - /** @export */ ab: ___syscall_chdir, - /** @export */ Q: ___syscall_chmod, - /** @export */ $a: ___syscall_connect, - /** @export */ _a: ___syscall_dup, - /** @export */ Za: ___syscall_dup3, - /** @export */ Ya: ___syscall_faccessat, - /** @export */ fa: ___syscall_fallocate, - /** @export */ Xa: ___syscall_fchmod, - /** @export */ Wa: ___syscall_fchown32, - /** @export */ P: ___syscall_fchownat, - /** @export */ m: ___syscall_fcntl64, - /** @export */ Va: ___syscall_fdatasync, - /** @export */ Ua: ___syscall_fstat64, - /** @export */ ma: ___syscall_ftruncate64, - /** @export */ Ta: ___syscall_getcwd, - /** @export */ Sa: ___syscall_getdents64, - /** @export */ Ra: ___syscall_getpeername, - /** @export */ Qa: ___syscall_getsockname, - /** @export */ Pa: ___syscall_getsockopt, - /** @export */ E: ___syscall_ioctl, - /** @export */ Oa: ___syscall_listen, - /** @export */ Na: ___syscall_lstat64, - /** @export */ Ma: ___syscall_mkdirat, - /** @export */ La: ___syscall_newfstatat, - /** @export */ y: ___syscall_openat, - /** @export */ Ka: ___syscall_pipe, - /** @export */ Ja: ___syscall_poll, - /** @export */ Ia: ___syscall_readlinkat, - /** @export */ Ha: ___syscall_recvfrom, - /** @export */ Ga: ___syscall_renameat, - /** @export */ O: ___syscall_rmdir, - /** @export */ Fa: ___syscall_sendto, - /** @export */ N: ___syscall_socket, - /** @export */ Ea: ___syscall_stat64, - /** @export */ Da: ___syscall_statfs64, - /** @export */ Ca: ___syscall_symlink, - /** @export */ D: ___syscall_unlinkat, - /** @export */ Ba: ___syscall_utimensat, - /** @export */ wa: __abort_js, - /** @export */ va: __emscripten_get_now_is_monotonic, - /** @export */ ua: __emscripten_lookup_name, - /** @export */ ta: __emscripten_memcpy_js, - /** @export */ sa: __emscripten_runtime_keepalive_clear, - /** @export */ ra: __emscripten_throw_longjmp, - /** @export */ ia: __gmtime_js, - /** @export */ ja: __localtime_js, - /** @export */ ka: __mktime_js, - /** @export */ ga: __mmap_js, - /** @export */ ha: __munmap_js, - /** @export */ K: __setitimer_js, - /** @export */ qa: __tzset_js, - /** @export */ B: _emscripten_date_now, - /** @export */ pa: _emscripten_get_heap_max, - /** @export */ v: _emscripten_get_now, - /** @export */ oa: _emscripten_resize_heap, - /** @export */ J: _emscripten_sleep, - /** @export */ Aa: _environ_get, - /** @export */ za: _environ_sizes_get, - /** @export */ q: _exit, - /** @export */ r: _fd_close, - /** @export */ M: _fd_fdstat_get, - /** @export */ L: _fd_read, - /** @export */ la: _fd_seek, - /** @export */ ya: _fd_sync, - /** @export */ C: _fd_write, - /** @export */ I: _getaddrinfo, - /** @export */ ea: _getcontext, - /** @export */ da: _getdtablesize, - /** @export */ x: _getnameinfo, - /** @export */ ca: _getprotobyname, - /** @export */ ba: _getprotobynumber, - /** @export */ i: invoke_i, - /** @export */ c: invoke_ii, - /** @export */ b: invoke_iii, - /** @export */ f: invoke_iiii, - /** @export */ h: invoke_iiiii, - /** @export */ p: invoke_iiiiii, - /** @export */ t: invoke_iiiiiii, - /** @export */ w: invoke_iiiiiiii, - /** @export */ H: invoke_iiiiiiiiii, - /** @export */ na: invoke_jii, - /** @export */ e: invoke_v, - /** @export */ a: invoke_vi, - /** @export */ d: invoke_vii, - /** @export */ A: invoke_viidii, - /** @export */ g: invoke_viii, - /** @export */ j: invoke_viiii, - /** @export */ l: invoke_viiiii, - /** @export */ k: invoke_viiiiii, - /** @export */ aa: invoke_viiiiiii, - /** @export */ z: invoke_viiiiiiiii, - /** @export */ G: _js_create_input_device, - /** @export */ $: js_fd_read, - /** @export */ F: _js_open_process, - /** @export */ Z: js_popen_to_file, - /** @export */ Y: _js_process_status, - /** @export */ X: _js_waitpid, - /** @export */ W: _makecontext, - /** @export */ xa: _proc_exit, - /** @export */ V: _strftime, - /** @export */ U: _strftime_l, - /** @export */ T: _strptime, - /** @export */ S: _swapcontext, - /** @export */ s: _wasm_close, - /** @export */ u: wasm_poll_socket, - /** @export */ o: _wasm_setsockopt, - /** @export */ R: _wasm_shutdown -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["ib"])(); - -var _free = a0 => (_free = wasmExports["jb"])(a0); - -var _malloc = a0 => (_malloc = wasmExports["lb"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["mb"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["nb"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["ob"])(a0, a1, a2); - -var _htons = a0 => (_htons = wasmExports["pb"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["qb"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["rb"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["sb"])(a0); - -var _fflush = a0 => (_fflush = wasmExports["tb"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["ub"])(a0, a1, a2); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["vb"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["wb"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["xb"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["yb"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["zb"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["Ab"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["Bb"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["Cb"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["Db"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["Eb"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["Fb"])(a0); - -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["Gb"])(a0); - -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["Hb"])(a0); - -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["Ib"])(a0); - -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["Jb"])(a0); - -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["Kb"])(a0); - -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["Lb"])(a0); - -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["Mb"])(a0); - -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["Nb"])(); - -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["Ob"])(); - -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["Pb"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["Qb"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["Rb"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["Sb"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["Tb"])(a0, a1); - -var _setThrew = (a0, a1) => (_setThrew = wasmExports["Ub"])(a0, a1); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["Vb"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["Wb"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["Xb"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["Yb"])(); - -var dynCall_iiii = Module["dynCall_iiii"] = (a0, a1, a2, a3) => (dynCall_iiii = Module["dynCall_iiii"] = wasmExports["Zb"])(a0, a1, a2, a3); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + /** @type {function(...*):?} */ function _swapcontext() { + abort('missing function: swapcontext'); + } + + _swapcontext.stub = true; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + function _wasm_shutdown(socketd, how) { + return PHPWASM.shutdownSocket(socketd, how); + } + + /** @type {WebAssembly.Table} */ var wasmTable; + + var runAndAbortIfError = (func) => { + try { + return func(); + } catch (e) { + abort(e); + } + }; + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + } + } + }, + instrumentWasmExports(exports) { + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + ret[x] = (...args) => { + Asyncify.exportCallStack.push(x); + try { + return original(...args); + } finally { + if (!ABORT) { + var y = Asyncify.exportCallStack.pop(); + Asyncify.maybeStopUnwind(); + } + } + }; + } else { + ret[x] = original; + } + } + return ret; + }, + State: { + Normal: 0, + Unwinding: 1, + Rewinding: 2, + Disabled: 3, + }, + state: 0, + StackSize: 4096, + currData: null, + handleSleepReturnValue: 0, + exportCallStack: [], + callStackNameToId: {}, + callStackIdToName: {}, + callStackId: 0, + asyncPromiseHandlers: null, + sleepCallbacks: [], + getCallStackId(funcName) { + var id = Asyncify.callStackNameToId[funcName]; + if (id === undefined) { + id = Asyncify.callStackId++; + Asyncify.callStackNameToId[funcName] = id; + Asyncify.callStackIdToName[id] = funcName; + } + return id; + }, + maybeStopUnwind() { + if ( + Asyncify.currData && + Asyncify.state === Asyncify.State.Unwinding && + Asyncify.exportCallStack.length === 0 + ) { + Asyncify.state = Asyncify.State.Normal; + runtimeKeepalivePush(); + runAndAbortIfError(_asyncify_stop_unwind); + if (typeof Fibers != 'undefined') { + Fibers.trampoline(); + } + } + }, + whenDone() { + return new Promise((resolve, reject) => { + Asyncify.asyncPromiseHandlers = { + resolve: resolve, + reject: 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] = stack; + HEAPU32[(ptr + 4) >> 2] = stack + stackSize; + }, + setDataRewindFunc(ptr) { + var bottomOfCallStack = Asyncify.exportCallStack[0]; + var rewindId = Asyncify.getCallStackId(bottomOfCallStack); + HEAP32[(ptr + 8) >> 2] = rewindId; + }, + getDataRewindFuncName(ptr) { + var id = HEAP32[(ptr + 8) >> 2]; + var name = Asyncify.callStackIdToName[id]; + return name; + }, + getDataRewindFunc(name) { + var func = wasmExports[name]; + return func; + }, + doRewind(ptr) { + var name = Asyncify.getDataRewindFuncName(ptr); + var func = Asyncify.getDataRewindFunc(name); + runtimeKeepalivePop(); + return 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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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) { + return Asyncify.handleSleep((wakeUp) => { + startAsync().then(wakeUp); + }); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var previousAsync = Asyncify.currData; + var ret = func(...cArgs); + function onDone(ret) { + runtimeKeepalivePop(); + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + runtimeKeepalivePush(); + if (Asyncify.currData != previousAsync) { + return Asyncify.whenDone().then(onDone); + } + ret = onDone(ret); + if (asyncMode) return Promise.resolve(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ gb: _SharpYuvConvert, + /** @export */ fb: _SharpYuvGetConversionMatrix, + /** @export */ eb: _SharpYuvInit, + /** @export */ n: ___assert_fail, + /** @export */ _: __asyncjs__js_module_onMessage, + /** @export */ db: ___call_sighandler, + /** @export */ cb: ___syscall_accept4, + /** @export */ bb: ___syscall_bind, + /** @export */ ab: ___syscall_chdir, + /** @export */ Q: ___syscall_chmod, + /** @export */ $a: ___syscall_connect, + /** @export */ _a: ___syscall_dup, + /** @export */ Za: ___syscall_dup3, + /** @export */ Ya: ___syscall_faccessat, + /** @export */ fa: ___syscall_fallocate, + /** @export */ Xa: ___syscall_fchmod, + /** @export */ Wa: ___syscall_fchown32, + /** @export */ P: ___syscall_fchownat, + /** @export */ m: ___syscall_fcntl64, + /** @export */ Va: ___syscall_fdatasync, + /** @export */ Ua: ___syscall_fstat64, + /** @export */ ma: ___syscall_ftruncate64, + /** @export */ Ta: ___syscall_getcwd, + /** @export */ Sa: ___syscall_getdents64, + /** @export */ Ra: ___syscall_getpeername, + /** @export */ Qa: ___syscall_getsockname, + /** @export */ Pa: ___syscall_getsockopt, + /** @export */ E: ___syscall_ioctl, + /** @export */ Oa: ___syscall_listen, + /** @export */ Na: ___syscall_lstat64, + /** @export */ Ma: ___syscall_mkdirat, + /** @export */ La: ___syscall_newfstatat, + /** @export */ y: ___syscall_openat, + /** @export */ Ka: ___syscall_pipe, + /** @export */ Ja: ___syscall_poll, + /** @export */ Ia: ___syscall_readlinkat, + /** @export */ Ha: ___syscall_recvfrom, + /** @export */ Ga: ___syscall_renameat, + /** @export */ O: ___syscall_rmdir, + /** @export */ Fa: ___syscall_sendto, + /** @export */ N: ___syscall_socket, + /** @export */ Ea: ___syscall_stat64, + /** @export */ Da: ___syscall_statfs64, + /** @export */ Ca: ___syscall_symlink, + /** @export */ D: ___syscall_unlinkat, + /** @export */ Ba: ___syscall_utimensat, + /** @export */ wa: __abort_js, + /** @export */ va: __emscripten_get_now_is_monotonic, + /** @export */ ua: __emscripten_lookup_name, + /** @export */ ta: __emscripten_memcpy_js, + /** @export */ sa: __emscripten_runtime_keepalive_clear, + /** @export */ ra: __emscripten_throw_longjmp, + /** @export */ ia: __gmtime_js, + /** @export */ ja: __localtime_js, + /** @export */ ka: __mktime_js, + /** @export */ ga: __mmap_js, + /** @export */ ha: __munmap_js, + /** @export */ K: __setitimer_js, + /** @export */ qa: __tzset_js, + /** @export */ B: _emscripten_date_now, + /** @export */ pa: _emscripten_get_heap_max, + /** @export */ v: _emscripten_get_now, + /** @export */ oa: _emscripten_resize_heap, + /** @export */ J: _emscripten_sleep, + /** @export */ Aa: _environ_get, + /** @export */ za: _environ_sizes_get, + /** @export */ q: _exit, + /** @export */ r: _fd_close, + /** @export */ M: _fd_fdstat_get, + /** @export */ L: _fd_read, + /** @export */ la: _fd_seek, + /** @export */ ya: _fd_sync, + /** @export */ C: _fd_write, + /** @export */ I: _getaddrinfo, + /** @export */ ea: _getcontext, + /** @export */ da: _getdtablesize, + /** @export */ x: _getnameinfo, + /** @export */ ca: _getprotobyname, + /** @export */ ba: _getprotobynumber, + /** @export */ i: invoke_i, + /** @export */ c: invoke_ii, + /** @export */ b: invoke_iii, + /** @export */ f: invoke_iiii, + /** @export */ h: invoke_iiiii, + /** @export */ p: invoke_iiiiii, + /** @export */ t: invoke_iiiiiii, + /** @export */ w: invoke_iiiiiiii, + /** @export */ H: invoke_iiiiiiiiii, + /** @export */ na: invoke_jii, + /** @export */ e: invoke_v, + /** @export */ a: invoke_vi, + /** @export */ d: invoke_vii, + /** @export */ A: invoke_viidii, + /** @export */ g: invoke_viii, + /** @export */ j: invoke_viiii, + /** @export */ l: invoke_viiiii, + /** @export */ k: invoke_viiiiii, + /** @export */ aa: invoke_viiiiiii, + /** @export */ z: invoke_viiiiiiiii, + /** @export */ G: _js_create_input_device, + /** @export */ $: js_fd_read, + /** @export */ F: _js_open_process, + /** @export */ Z: js_popen_to_file, + /** @export */ Y: _js_process_status, + /** @export */ X: _js_waitpid, + /** @export */ W: _makecontext, + /** @export */ xa: _proc_exit, + /** @export */ V: _strftime, + /** @export */ U: _strftime_l, + /** @export */ T: _strptime, + /** @export */ S: _swapcontext, + /** @export */ s: _wasm_close, + /** @export */ u: wasm_poll_socket, + /** @export */ o: _wasm_setsockopt, + /** @export */ R: _wasm_shutdown, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports['ib'])(); + + var _free = (a0) => (_free = wasmExports['jb'])(a0); + + var _malloc = (a0) => (_malloc = wasmExports['lb'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['mb'])(a0, a1)); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = wasmExports['nb'])( + a0, + a1, + a2, + a3 + )); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = wasmExports['ob'])( + a0, + a1, + a2 + )); + + var _htons = (a0) => (_htons = wasmExports['pb'])(a0); + + var _ntohs = (a0) => (_ntohs = wasmExports['qb'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['rb'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['sb'])(a0)); + + var _fflush = (a0) => (_fflush = wasmExports['tb'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['ub'])(a0, a1, a2)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = wasmExports['vb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = wasmExports['wb'])( + a0 + )); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['xb'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['yb'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['zb'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['Ab'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['Bb'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['Cb'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['Db'])(a0)); + + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['Eb'])(a0)); + + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['Fb'])(a0)); -var dynCall_ii = Module["dynCall_ii"] = (a0, a1) => (dynCall_ii = Module["dynCall_ii"] = wasmExports["_b"])(a0, a1); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['Gb'])(a0)); -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["$b"])(a0, a1); - -var dynCall_vii = Module["dynCall_vii"] = (a0, a1, a2) => (dynCall_vii = Module["dynCall_vii"] = wasmExports["ac"])(a0, a1, a2); - -var dynCall_viiiii = Module["dynCall_viiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viiiii = Module["dynCall_viiiii"] = wasmExports["bc"])(a0, a1, a2, a3, a4, a5); - -var dynCall_iii = Module["dynCall_iii"] = (a0, a1, a2) => (dynCall_iii = Module["dynCall_iii"] = wasmExports["cc"])(a0, a1, a2); - -var dynCall_iiiii = Module["dynCall_iiiii"] = (a0, a1, a2, a3, a4) => (dynCall_iiiii = Module["dynCall_iiiii"] = wasmExports["dc"])(a0, a1, a2, a3, a4); - -var dynCall_iiiiii = Module["dynCall_iiiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_iiiiii = Module["dynCall_iiiiii"] = wasmExports["ec"])(a0, a1, a2, a3, a4, a5); - -var dynCall_viii = Module["dynCall_viii"] = (a0, a1, a2, a3) => (dynCall_viii = Module["dynCall_viii"] = wasmExports["fc"])(a0, a1, a2, a3); - -var dynCall_v = Module["dynCall_v"] = a0 => (dynCall_v = Module["dynCall_v"] = wasmExports["gc"])(a0); - -var dynCall_i = Module["dynCall_i"] = a0 => (dynCall_i = Module["dynCall_i"] = wasmExports["hc"])(a0); - -var dynCall_viiii = Module["dynCall_viiii"] = (a0, a1, a2, a3, a4) => (dynCall_viiii = Module["dynCall_viiii"] = wasmExports["ic"])(a0, a1, a2, a3, a4); - -var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_iiiiiii = Module["dynCall_iiiiiii"] = wasmExports["jc"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = wasmExports["kc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_viiiiiii = Module["dynCall_viiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_viiiiiii = Module["dynCall_viiiiiii"] = wasmExports["lc"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_viiiiii = Module["dynCall_viiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_viiiiii = Module["dynCall_viiiiii"] = wasmExports["mc"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = wasmExports["nc"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = wasmExports["oc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_jii = Module["dynCall_jii"] = (a0, a1, a2) => (dynCall_jii = Module["dynCall_jii"] = wasmExports["pc"])(a0, a1, a2); - -var dynCall_viidii = Module["dynCall_viidii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viidii = Module["dynCall_viidii"] = wasmExports["qc"])(a0, a1, a2, a3, a4, a5); - -var _asyncify_start_unwind = a0 => (_asyncify_start_unwind = wasmExports["rc"])(a0); - -var _asyncify_stop_unwind = () => (_asyncify_stop_unwind = wasmExports["sc"])(); - -var _asyncify_start_rewind = a0 => (_asyncify_start_rewind = wasmExports["tc"])(a0); - -var _asyncify_stop_rewind = () => (_asyncify_stop_rewind = wasmExports["uc"])(); - -function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vi(index, a1) { - var sp = stackSave(); - try { - dynCall_vi(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiii(index, a1, a2, a3) { - var sp = stackSave(); - try { - return dynCall_iiii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_iii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vii(index, a1, a2) { - var sp = stackSave(); - try { - dynCall_vii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_ii(index, a1) { - var sp = stackSave(); - try { - return dynCall_ii(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viii(index, a1, a2, a3) { - var sp = stackSave(); - try { - dynCall_viii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_v(index) { - var sp = stackSave(); - try { - dynCall_v(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_i(index) { - var sp = stackSave(); - try { - return dynCall_i(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - dynCall_viiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - return dynCall_iiiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - return dynCall_iiiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - return dynCall_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viidii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viidii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - dynCall_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_jii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_jii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['Hb'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['Ib'])(a0)); + + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['Jb'])(a0)); + + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['Kb'])(a0)); + + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = wasmExports['Lb'])( + a0 + )); + + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['Mb'])(a0)); + + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['Nb'])()); + + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['Ob'])()); + + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = wasmExports['Pb'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['Qb'])(a0)); + + var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports['Rb'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = wasmExports['Sb'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['Tb'])(a0, a1); + + var _setThrew = (a0, a1) => (_setThrew = wasmExports['Ub'])(a0, a1); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['Vb'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['Wb'])(a0); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['Xb'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = wasmExports['Yb'])(); + + var dynCall_iiii = (Module['dynCall_iiii'] = (a0, a1, a2, a3) => + (dynCall_iiii = Module['dynCall_iiii'] = wasmExports['Zb'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_ii = (Module['dynCall_ii'] = (a0, a1) => + (dynCall_ii = Module['dynCall_ii'] = wasmExports['_b'])(a0, a1)); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['$b'])(a0, a1)); + + var dynCall_vii = (Module['dynCall_vii'] = (a0, a1, a2) => + (dynCall_vii = Module['dynCall_vii'] = wasmExports['ac'])(a0, a1, a2)); + + var dynCall_viiiii = (Module['dynCall_viiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viiiii = Module['dynCall_viiiii'] = wasmExports['bc'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_iii = (Module['dynCall_iii'] = (a0, a1, a2) => + (dynCall_iii = Module['dynCall_iii'] = wasmExports['cc'])(a0, a1, a2)); + + var dynCall_iiiii = (Module['dynCall_iiiii'] = (a0, a1, a2, a3, a4) => + (dynCall_iiiii = Module['dynCall_iiiii'] = wasmExports['dc'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iiiiii = (Module['dynCall_iiiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_iiiiii = Module['dynCall_iiiiii'] = wasmExports['ec'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_viii = (Module['dynCall_viii'] = (a0, a1, a2, a3) => + (dynCall_viii = Module['dynCall_viii'] = wasmExports['fc'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_v = (Module['dynCall_v'] = (a0) => + (dynCall_v = Module['dynCall_v'] = wasmExports['gc'])(a0)); + + var dynCall_i = (Module['dynCall_i'] = (a0) => + (dynCall_i = Module['dynCall_i'] = wasmExports['hc'])(a0)); + + var dynCall_viiii = (Module['dynCall_viiii'] = (a0, a1, a2, a3, a4) => + (dynCall_viiii = Module['dynCall_viiii'] = wasmExports['ic'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iiiiiii = (Module['dynCall_iiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_iiiiiii = Module['dynCall_iiiiiii'] = wasmExports['jc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_viiiiiiiii = (Module['dynCall_viiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_viiiiiiiii = Module['dynCall_viiiiiiiii'] = wasmExports['kc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_viiiiiii = (Module['dynCall_viiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_viiiiiii = Module['dynCall_viiiiiii'] = wasmExports['lc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_viiiiii = (Module['dynCall_viiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_viiiiii = Module['dynCall_viiiiii'] = wasmExports['mc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_iiiiiiii = (Module['dynCall_iiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_iiiiiiii = Module['dynCall_iiiiiiii'] = wasmExports['nc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_iiiiiiiiii = (Module['dynCall_iiiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_iiiiiiiiii = Module['dynCall_iiiiiiiiii'] = wasmExports['oc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_jii = (Module['dynCall_jii'] = (a0, a1, a2) => + (dynCall_jii = Module['dynCall_jii'] = wasmExports['pc'])(a0, a1, a2)); + + var dynCall_viidii = (Module['dynCall_viidii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viidii = Module['dynCall_viidii'] = wasmExports['qc'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var _asyncify_start_unwind = (a0) => + (_asyncify_start_unwind = wasmExports['rc'])(a0); + + var _asyncify_stop_unwind = () => + (_asyncify_stop_unwind = wasmExports['sc'])(); + + var _asyncify_start_rewind = (a0) => + (_asyncify_start_rewind = wasmExports['tc'])(a0); + + var _asyncify_stop_rewind = () => + (_asyncify_stop_rewind = wasmExports['uc'])(); + + function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vi(index, a1) { + var sp = stackSave(); + try { + dynCall_vi(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiii(index, a1, a2, a3) { + var sp = stackSave(); + try { + return dynCall_iiii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_iii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vii(index, a1, a2) { + var sp = stackSave(); + try { + dynCall_vii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_ii(index, a1) { + var sp = stackSave(); + try { + return dynCall_ii(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viii(index, a1, a2, a3) { + var sp = stackSave(); + try { + dynCall_viii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_v(index) { + var sp = stackSave(); + try { + dynCall_v(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_i(index) { + var sp = stackSave(); + try { + return dynCall_i(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + dynCall_viiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + return dynCall_iiiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + return dynCall_iiiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + return dynCall_iiiiiiiiii( + index, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viidii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viidii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + dynCall_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_jii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_jii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/asyncify/php_8_3.js b/packages/php-wasm/node/asyncify/php_8_3.js index 87b1474b3e..1611c5b05a 100644 --- a/packages/php-wasm/node/asyncify/php_8_3.js +++ b/packages/php-wasm/node/asyncify/php_8_3.js @@ -1,6665 +1,7715 @@ -const dependencyFilename = __dirname + '/8_3_0/php_8_3.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 15081983; +const dependencyFilename = __dirname + '/8_3_0/php_8_3.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 15081983; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - return { - "a": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["hb"]; - updateMemoryViews(); - wasmTable = wasmExports["kb"]; - addOnInit(wasmExports["ib"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function js_popen_to_file(command, mode, exitCodePtr) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); -} - -function wasm_poll_socket(socketd, events, timeout) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); -} - -function js_fd_read(fd, iov, iovcnt, pnum) { - const returnCallback = resolver => Asyncify.handleSleep(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); -} - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var stackRestore = val => __emscripten_stack_restore(val); - -var stackSave = () => _emscripten_stack_get_current(); - -/** @type {function(...*):?} */ function _SharpYuvConvert() { - abort("missing function: SharpYuvConvert"); -} - -_SharpYuvConvert.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { - abort("missing function: SharpYuvGetConversionMatrix"); -} - -_SharpYuvGetConversionMatrix.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvInit() { - abort("missing function: SharpYuvInit"); -} - -_SharpYuvInit.stub = true; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_fallocate(fd, mode, offset_low, offset_high, len_low, len_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - var len = convertI32PairToI53Checked(len_low, len_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.allocate(stream, offset, len); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fdatasync(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -var __emscripten_throw_longjmp = () => { - throw Infinity; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -/** @type {function(...*):?} */ function _getcontext() { - abort("missing function: getcontext"); -} - -_getcontext.stub = true; - -/** @type {function(...*):?} */ function _getdtablesize() { - abort("missing function: getdtablesize"); -} - -_getdtablesize.stub = true; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -/** @type {function(...*):?} */ function _makecontext() { - abort("missing function: makecontext"); -} - -_makecontext.stub = true; - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + return { + a: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['hb']; + updateMemoryViews(); + wasmTable = wasmExports['kb']; + addOnInit(wasmExports['ib']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function js_popen_to_file(command, mode, exitCodePtr) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce((acc, curr) => acc + curr.length, 0) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + } + + function wasm_poll_socket(socketd, events, timeout) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + } + + function js_fd_read(fd, iov, iovcnt, pnum) { + const returnCallback = (resolver) => Asyncify.handleSleep(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + } + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + /** @type {function(...*):?} */ function _SharpYuvConvert() { + abort('missing function: SharpYuvConvert'); + } + + _SharpYuvConvert.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { + abort('missing function: SharpYuvGetConversionMatrix'); + } + + _SharpYuvGetConversionMatrix.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvInit() { + abort('missing function: SharpYuvInit'); + } + + _SharpYuvInit.stub = true; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_fallocate( + fd, + mode, + offset_low, + offset_high, + len_low, + len_high + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + var len = convertI32PairToI53Checked(len_low, len_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.allocate(stream, offset, len); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fdatasync(fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + var __emscripten_throw_longjmp = () => { + throw Infinity; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + /** @type {function(...*):?} */ function _getcontext() { + abort('missing function: getcontext'); + } + + _getcontext.stub = true; + + /** @type {function(...*):?} */ function _getdtablesize() { + abort('missing function: getdtablesize'); + } + + _getdtablesize.stub = true; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + /** @type {function(...*):?} */ function _makecontext() { + abort('missing function: makecontext'); + } + + _makecontext.stub = true; + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6670,923 +7720,1239 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -/** @type {function(...*):?} */ function _swapcontext() { - abort("missing function: swapcontext"); -} - -_swapcontext.stub = true; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -function _wasm_shutdown(socketd, how) { - return PHPWASM.shutdownSocket(socketd, how); -} - -/** @type {WebAssembly.Table} */ var wasmTable; - -var runAndAbortIfError = func => { - try { - return func(); - } catch (e) { - abort(e); - } -}; - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - } - } - }, - instrumentWasmExports(exports) { - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - ret[x] = (...args) => { - Asyncify.exportCallStack.push(x); - try { - return original(...args); - } finally { - if (!ABORT) { - var y = Asyncify.exportCallStack.pop(); - Asyncify.maybeStopUnwind(); - } - } - }; - } else { - ret[x] = original; - } - } - return ret; - }, - State: { - Normal: 0, - Unwinding: 1, - Rewinding: 2, - Disabled: 3 - }, - state: 0, - StackSize: 4096, - currData: null, - handleSleepReturnValue: 0, - exportCallStack: [], - callStackNameToId: {}, - callStackIdToName: {}, - callStackId: 0, - asyncPromiseHandlers: null, - sleepCallbacks: [], - getCallStackId(funcName) { - var id = Asyncify.callStackNameToId[funcName]; - if (id === undefined) { - id = Asyncify.callStackId++; - Asyncify.callStackNameToId[funcName] = id; - Asyncify.callStackIdToName[id] = funcName; - } - return id; - }, - maybeStopUnwind() { - if (Asyncify.currData && Asyncify.state === Asyncify.State.Unwinding && Asyncify.exportCallStack.length === 0) { - Asyncify.state = Asyncify.State.Normal; - runtimeKeepalivePush(); - runAndAbortIfError(_asyncify_stop_unwind); - if (typeof Fibers != "undefined") { - Fibers.trampoline(); - } - } - }, - whenDone() { - return new Promise((resolve, reject) => { - Asyncify.asyncPromiseHandlers = { - resolve: resolve, - reject: 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)] = stack; - HEAPU32[(((ptr) + (4)) >> 2)] = stack + stackSize; - }, - setDataRewindFunc(ptr) { - var bottomOfCallStack = Asyncify.exportCallStack[0]; - var rewindId = Asyncify.getCallStackId(bottomOfCallStack); - HEAP32[(((ptr) + (8)) >> 2)] = rewindId; - }, - getDataRewindFuncName(ptr) { - var id = HEAP32[(((ptr) + (8)) >> 2)]; - var name = Asyncify.callStackIdToName[id]; - return name; - }, - getDataRewindFunc(name) { - var func = wasmExports[name]; - return func; - }, - doRewind(ptr) { - var name = Asyncify.getDataRewindFuncName(ptr); - var func = Asyncify.getDataRewindFunc(name); - runtimeKeepalivePop(); - return 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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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 Browser != "undefined" && Browser.mainLoop.func) { - Browser.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) { - return Asyncify.handleSleep(wakeUp => { - startAsync().then(wakeUp); - }); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var previousAsync = Asyncify.currData; - var ret = func(...cArgs); - function onDone(ret) { - runtimeKeepalivePop(); - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - runtimeKeepalivePush(); - if (Asyncify.currData != previousAsync) { - return Asyncify.whenDone().then(onDone); - } - ret = onDone(ret); - if (asyncMode) return Promise.resolve(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ gb: _SharpYuvConvert, - /** @export */ fb: _SharpYuvGetConversionMatrix, - /** @export */ eb: _SharpYuvInit, - /** @export */ l: ___assert_fail, - /** @export */ _: __asyncjs__js_module_onMessage, - /** @export */ db: ___call_sighandler, - /** @export */ cb: ___syscall_accept4, - /** @export */ bb: ___syscall_bind, - /** @export */ ab: ___syscall_chdir, - /** @export */ R: ___syscall_chmod, - /** @export */ $a: ___syscall_connect, - /** @export */ _a: ___syscall_dup, - /** @export */ Za: ___syscall_dup3, - /** @export */ Ya: ___syscall_faccessat, - /** @export */ fa: ___syscall_fallocate, - /** @export */ Xa: ___syscall_fchmod, - /** @export */ Wa: ___syscall_fchown32, - /** @export */ Q: ___syscall_fchownat, - /** @export */ n: ___syscall_fcntl64, - /** @export */ Va: ___syscall_fdatasync, - /** @export */ Ua: ___syscall_fstat64, - /** @export */ ma: ___syscall_ftruncate64, - /** @export */ Ta: ___syscall_getcwd, - /** @export */ Sa: ___syscall_getdents64, - /** @export */ Ra: ___syscall_getpeername, - /** @export */ Qa: ___syscall_getsockname, - /** @export */ Pa: ___syscall_getsockopt, - /** @export */ F: ___syscall_ioctl, - /** @export */ Oa: ___syscall_listen, - /** @export */ Na: ___syscall_lstat64, - /** @export */ Ma: ___syscall_mkdirat, - /** @export */ La: ___syscall_newfstatat, - /** @export */ y: ___syscall_openat, - /** @export */ Ka: ___syscall_pipe, - /** @export */ Ja: ___syscall_poll, - /** @export */ Ia: ___syscall_readlinkat, - /** @export */ Ha: ___syscall_recvfrom, - /** @export */ Ga: ___syscall_renameat, - /** @export */ P: ___syscall_rmdir, - /** @export */ Fa: ___syscall_sendto, - /** @export */ O: ___syscall_socket, - /** @export */ Ea: ___syscall_stat64, - /** @export */ Da: ___syscall_statfs64, - /** @export */ Ca: ___syscall_symlink, - /** @export */ E: ___syscall_unlinkat, - /** @export */ Ba: ___syscall_utimensat, - /** @export */ wa: __abort_js, - /** @export */ va: __emscripten_get_now_is_monotonic, - /** @export */ ua: __emscripten_lookup_name, - /** @export */ ta: __emscripten_memcpy_js, - /** @export */ sa: __emscripten_runtime_keepalive_clear, - /** @export */ ra: __emscripten_throw_longjmp, - /** @export */ ia: __gmtime_js, - /** @export */ ja: __localtime_js, - /** @export */ ka: __mktime_js, - /** @export */ ga: __mmap_js, - /** @export */ ha: __munmap_js, - /** @export */ L: __setitimer_js, - /** @export */ qa: __tzset_js, - /** @export */ C: _emscripten_date_now, - /** @export */ pa: _emscripten_get_heap_max, - /** @export */ v: _emscripten_get_now, - /** @export */ oa: _emscripten_resize_heap, - /** @export */ K: _emscripten_sleep, - /** @export */ Aa: _environ_get, - /** @export */ za: _environ_sizes_get, - /** @export */ p: _exit, - /** @export */ q: _fd_close, - /** @export */ N: _fd_fdstat_get, - /** @export */ M: _fd_read, - /** @export */ la: _fd_seek, - /** @export */ ya: _fd_sync, - /** @export */ D: _fd_write, - /** @export */ J: _getaddrinfo, - /** @export */ ea: _getcontext, - /** @export */ da: _getdtablesize, - /** @export */ x: _getnameinfo, - /** @export */ ca: _getprotobyname, - /** @export */ ba: _getprotobynumber, - /** @export */ j: invoke_i, - /** @export */ c: invoke_ii, - /** @export */ b: invoke_iii, - /** @export */ f: invoke_iiii, - /** @export */ i: invoke_iiiii, - /** @export */ m: invoke_iiiiii, - /** @export */ u: invoke_iiiiiii, - /** @export */ w: invoke_iiiiiiii, - /** @export */ I: invoke_iiiiiiiiii, - /** @export */ na: invoke_jii, - /** @export */ e: invoke_v, - /** @export */ a: invoke_vi, - /** @export */ d: invoke_vii, - /** @export */ B: invoke_viidii, - /** @export */ g: invoke_viii, - /** @export */ k: invoke_viiii, - /** @export */ h: invoke_viiiii, - /** @export */ A: invoke_viiiiii, - /** @export */ aa: invoke_viiiiiii, - /** @export */ z: invoke_viiiiiiiii, - /** @export */ H: _js_create_input_device, - /** @export */ $: js_fd_read, - /** @export */ G: _js_open_process, - /** @export */ Z: js_popen_to_file, - /** @export */ Y: _js_process_status, - /** @export */ X: _js_waitpid, - /** @export */ W: _makecontext, - /** @export */ xa: _proc_exit, - /** @export */ t: _strftime, - /** @export */ V: _strftime_l, - /** @export */ U: _strptime, - /** @export */ T: _swapcontext, - /** @export */ r: _wasm_close, - /** @export */ s: wasm_poll_socket, - /** @export */ o: _wasm_setsockopt, - /** @export */ S: _wasm_shutdown -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["ib"])(); - -var _free = a0 => (_free = wasmExports["jb"])(a0); - -var _malloc = a0 => (_malloc = wasmExports["lb"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["mb"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["nb"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["ob"])(a0, a1, a2); - -var _htons = a0 => (_htons = wasmExports["pb"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["qb"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["rb"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["sb"])(a0); - -var _fflush = a0 => (_fflush = wasmExports["tb"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["ub"])(a0, a1, a2); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["vb"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["wb"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["xb"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["yb"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["zb"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["Ab"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["Bb"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["Cb"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["Db"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["Eb"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["Fb"])(a0); - -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["Gb"])(a0); - -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["Hb"])(a0); - -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["Ib"])(a0); - -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["Jb"])(a0); - -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["Kb"])(a0); - -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["Lb"])(a0); - -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["Mb"])(a0); - -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["Nb"])(); - -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["Ob"])(); - -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["Pb"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["Qb"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["Rb"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["Sb"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["Tb"])(a0, a1); - -var _setThrew = (a0, a1) => (_setThrew = wasmExports["Ub"])(a0, a1); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["Vb"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["Wb"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["Xb"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["Yb"])(); - -var dynCall_iiii = Module["dynCall_iiii"] = (a0, a1, a2, a3) => (dynCall_iiii = Module["dynCall_iiii"] = wasmExports["Zb"])(a0, a1, a2, a3); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + /** @type {function(...*):?} */ function _swapcontext() { + abort('missing function: swapcontext'); + } + + _swapcontext.stub = true; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + function _wasm_shutdown(socketd, how) { + return PHPWASM.shutdownSocket(socketd, how); + } + + /** @type {WebAssembly.Table} */ var wasmTable; + + var runAndAbortIfError = (func) => { + try { + return func(); + } catch (e) { + abort(e); + } + }; + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(_dlopen_js|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|js_fd_read|_js_fd_read|js_module_onMessage|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|wasm_shutdown|_wasm_shutdown|_asyncjs__wasm_shutdown|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + } + } + }, + instrumentWasmExports(exports) { + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + ret[x] = (...args) => { + Asyncify.exportCallStack.push(x); + try { + return original(...args); + } finally { + if (!ABORT) { + var y = Asyncify.exportCallStack.pop(); + Asyncify.maybeStopUnwind(); + } + } + }; + } else { + ret[x] = original; + } + } + return ret; + }, + State: { + Normal: 0, + Unwinding: 1, + Rewinding: 2, + Disabled: 3, + }, + state: 0, + StackSize: 4096, + currData: null, + handleSleepReturnValue: 0, + exportCallStack: [], + callStackNameToId: {}, + callStackIdToName: {}, + callStackId: 0, + asyncPromiseHandlers: null, + sleepCallbacks: [], + getCallStackId(funcName) { + var id = Asyncify.callStackNameToId[funcName]; + if (id === undefined) { + id = Asyncify.callStackId++; + Asyncify.callStackNameToId[funcName] = id; + Asyncify.callStackIdToName[id] = funcName; + } + return id; + }, + maybeStopUnwind() { + if ( + Asyncify.currData && + Asyncify.state === Asyncify.State.Unwinding && + Asyncify.exportCallStack.length === 0 + ) { + Asyncify.state = Asyncify.State.Normal; + runtimeKeepalivePush(); + runAndAbortIfError(_asyncify_stop_unwind); + if (typeof Fibers != 'undefined') { + Fibers.trampoline(); + } + } + }, + whenDone() { + return new Promise((resolve, reject) => { + Asyncify.asyncPromiseHandlers = { + resolve: resolve, + reject: 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] = stack; + HEAPU32[(ptr + 4) >> 2] = stack + stackSize; + }, + setDataRewindFunc(ptr) { + var bottomOfCallStack = Asyncify.exportCallStack[0]; + var rewindId = Asyncify.getCallStackId(bottomOfCallStack); + HEAP32[(ptr + 8) >> 2] = rewindId; + }, + getDataRewindFuncName(ptr) { + var id = HEAP32[(ptr + 8) >> 2]; + var name = Asyncify.callStackIdToName[id]; + return name; + }, + getDataRewindFunc(name) { + var func = wasmExports[name]; + return func; + }, + doRewind(ptr) { + var name = Asyncify.getDataRewindFuncName(ptr); + var func = Asyncify.getDataRewindFunc(name); + runtimeKeepalivePop(); + return 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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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 Browser != 'undefined' && + Browser.mainLoop.func + ) { + Browser.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) { + return Asyncify.handleSleep((wakeUp) => { + startAsync().then(wakeUp); + }); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var previousAsync = Asyncify.currData; + var ret = func(...cArgs); + function onDone(ret) { + runtimeKeepalivePop(); + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + runtimeKeepalivePush(); + if (Asyncify.currData != previousAsync) { + return Asyncify.whenDone().then(onDone); + } + ret = onDone(ret); + if (asyncMode) return Promise.resolve(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ gb: _SharpYuvConvert, + /** @export */ fb: _SharpYuvGetConversionMatrix, + /** @export */ eb: _SharpYuvInit, + /** @export */ l: ___assert_fail, + /** @export */ _: __asyncjs__js_module_onMessage, + /** @export */ db: ___call_sighandler, + /** @export */ cb: ___syscall_accept4, + /** @export */ bb: ___syscall_bind, + /** @export */ ab: ___syscall_chdir, + /** @export */ R: ___syscall_chmod, + /** @export */ $a: ___syscall_connect, + /** @export */ _a: ___syscall_dup, + /** @export */ Za: ___syscall_dup3, + /** @export */ Ya: ___syscall_faccessat, + /** @export */ fa: ___syscall_fallocate, + /** @export */ Xa: ___syscall_fchmod, + /** @export */ Wa: ___syscall_fchown32, + /** @export */ Q: ___syscall_fchownat, + /** @export */ n: ___syscall_fcntl64, + /** @export */ Va: ___syscall_fdatasync, + /** @export */ Ua: ___syscall_fstat64, + /** @export */ ma: ___syscall_ftruncate64, + /** @export */ Ta: ___syscall_getcwd, + /** @export */ Sa: ___syscall_getdents64, + /** @export */ Ra: ___syscall_getpeername, + /** @export */ Qa: ___syscall_getsockname, + /** @export */ Pa: ___syscall_getsockopt, + /** @export */ F: ___syscall_ioctl, + /** @export */ Oa: ___syscall_listen, + /** @export */ Na: ___syscall_lstat64, + /** @export */ Ma: ___syscall_mkdirat, + /** @export */ La: ___syscall_newfstatat, + /** @export */ y: ___syscall_openat, + /** @export */ Ka: ___syscall_pipe, + /** @export */ Ja: ___syscall_poll, + /** @export */ Ia: ___syscall_readlinkat, + /** @export */ Ha: ___syscall_recvfrom, + /** @export */ Ga: ___syscall_renameat, + /** @export */ P: ___syscall_rmdir, + /** @export */ Fa: ___syscall_sendto, + /** @export */ O: ___syscall_socket, + /** @export */ Ea: ___syscall_stat64, + /** @export */ Da: ___syscall_statfs64, + /** @export */ Ca: ___syscall_symlink, + /** @export */ E: ___syscall_unlinkat, + /** @export */ Ba: ___syscall_utimensat, + /** @export */ wa: __abort_js, + /** @export */ va: __emscripten_get_now_is_monotonic, + /** @export */ ua: __emscripten_lookup_name, + /** @export */ ta: __emscripten_memcpy_js, + /** @export */ sa: __emscripten_runtime_keepalive_clear, + /** @export */ ra: __emscripten_throw_longjmp, + /** @export */ ia: __gmtime_js, + /** @export */ ja: __localtime_js, + /** @export */ ka: __mktime_js, + /** @export */ ga: __mmap_js, + /** @export */ ha: __munmap_js, + /** @export */ L: __setitimer_js, + /** @export */ qa: __tzset_js, + /** @export */ C: _emscripten_date_now, + /** @export */ pa: _emscripten_get_heap_max, + /** @export */ v: _emscripten_get_now, + /** @export */ oa: _emscripten_resize_heap, + /** @export */ K: _emscripten_sleep, + /** @export */ Aa: _environ_get, + /** @export */ za: _environ_sizes_get, + /** @export */ p: _exit, + /** @export */ q: _fd_close, + /** @export */ N: _fd_fdstat_get, + /** @export */ M: _fd_read, + /** @export */ la: _fd_seek, + /** @export */ ya: _fd_sync, + /** @export */ D: _fd_write, + /** @export */ J: _getaddrinfo, + /** @export */ ea: _getcontext, + /** @export */ da: _getdtablesize, + /** @export */ x: _getnameinfo, + /** @export */ ca: _getprotobyname, + /** @export */ ba: _getprotobynumber, + /** @export */ j: invoke_i, + /** @export */ c: invoke_ii, + /** @export */ b: invoke_iii, + /** @export */ f: invoke_iiii, + /** @export */ i: invoke_iiiii, + /** @export */ m: invoke_iiiiii, + /** @export */ u: invoke_iiiiiii, + /** @export */ w: invoke_iiiiiiii, + /** @export */ I: invoke_iiiiiiiiii, + /** @export */ na: invoke_jii, + /** @export */ e: invoke_v, + /** @export */ a: invoke_vi, + /** @export */ d: invoke_vii, + /** @export */ B: invoke_viidii, + /** @export */ g: invoke_viii, + /** @export */ k: invoke_viiii, + /** @export */ h: invoke_viiiii, + /** @export */ A: invoke_viiiiii, + /** @export */ aa: invoke_viiiiiii, + /** @export */ z: invoke_viiiiiiiii, + /** @export */ H: _js_create_input_device, + /** @export */ $: js_fd_read, + /** @export */ G: _js_open_process, + /** @export */ Z: js_popen_to_file, + /** @export */ Y: _js_process_status, + /** @export */ X: _js_waitpid, + /** @export */ W: _makecontext, + /** @export */ xa: _proc_exit, + /** @export */ t: _strftime, + /** @export */ V: _strftime_l, + /** @export */ U: _strptime, + /** @export */ T: _swapcontext, + /** @export */ r: _wasm_close, + /** @export */ s: wasm_poll_socket, + /** @export */ o: _wasm_setsockopt, + /** @export */ S: _wasm_shutdown, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports['ib'])(); + + var _free = (a0) => (_free = wasmExports['jb'])(a0); + + var _malloc = (a0) => (_malloc = wasmExports['lb'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['mb'])(a0, a1)); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = wasmExports['nb'])( + a0, + a1, + a2, + a3 + )); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = wasmExports['ob'])( + a0, + a1, + a2 + )); + + var _htons = (a0) => (_htons = wasmExports['pb'])(a0); + + var _ntohs = (a0) => (_ntohs = wasmExports['qb'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['rb'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['sb'])(a0)); + + var _fflush = (a0) => (_fflush = wasmExports['tb'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['ub'])(a0, a1, a2)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = wasmExports['vb'])( + a0, + a1, + a2, + a3, + a4 + )); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = wasmExports['wb'])( + a0 + )); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['xb'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['yb'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['zb'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['Ab'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['Bb'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['Cb'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['Db'])(a0)); + + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['Eb'])(a0)); + + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['Fb'])(a0)); -var dynCall_ii = Module["dynCall_ii"] = (a0, a1) => (dynCall_ii = Module["dynCall_ii"] = wasmExports["_b"])(a0, a1); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['Gb'])(a0)); -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["$b"])(a0, a1); - -var dynCall_vii = Module["dynCall_vii"] = (a0, a1, a2) => (dynCall_vii = Module["dynCall_vii"] = wasmExports["ac"])(a0, a1, a2); - -var dynCall_viiiii = Module["dynCall_viiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viiiii = Module["dynCall_viiiii"] = wasmExports["bc"])(a0, a1, a2, a3, a4, a5); - -var dynCall_iii = Module["dynCall_iii"] = (a0, a1, a2) => (dynCall_iii = Module["dynCall_iii"] = wasmExports["cc"])(a0, a1, a2); - -var dynCall_iiiii = Module["dynCall_iiiii"] = (a0, a1, a2, a3, a4) => (dynCall_iiiii = Module["dynCall_iiiii"] = wasmExports["dc"])(a0, a1, a2, a3, a4); - -var dynCall_iiiiii = Module["dynCall_iiiiii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_iiiiii = Module["dynCall_iiiiii"] = wasmExports["ec"])(a0, a1, a2, a3, a4, a5); - -var dynCall_viii = Module["dynCall_viii"] = (a0, a1, a2, a3) => (dynCall_viii = Module["dynCall_viii"] = wasmExports["fc"])(a0, a1, a2, a3); - -var dynCall_v = Module["dynCall_v"] = a0 => (dynCall_v = Module["dynCall_v"] = wasmExports["gc"])(a0); - -var dynCall_i = Module["dynCall_i"] = a0 => (dynCall_i = Module["dynCall_i"] = wasmExports["hc"])(a0); - -var dynCall_viiii = Module["dynCall_viiii"] = (a0, a1, a2, a3, a4) => (dynCall_viiii = Module["dynCall_viiii"] = wasmExports["ic"])(a0, a1, a2, a3, a4); - -var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_iiiiiii = Module["dynCall_iiiiiii"] = wasmExports["jc"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = wasmExports["kc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_viiiiiii = Module["dynCall_viiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_viiiiiii = Module["dynCall_viiiiiii"] = wasmExports["lc"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_viiiiii = Module["dynCall_viiiiii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_viiiiii = Module["dynCall_viiiiii"] = wasmExports["mc"])(a0, a1, a2, a3, a4, a5, a6); - -var dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7) => (dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = wasmExports["nc"])(a0, a1, a2, a3, a4, a5, a6, a7); - -var dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = wasmExports["oc"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - -var dynCall_jii = Module["dynCall_jii"] = (a0, a1, a2) => (dynCall_jii = Module["dynCall_jii"] = wasmExports["pc"])(a0, a1, a2); - -var dynCall_viidii = Module["dynCall_viidii"] = (a0, a1, a2, a3, a4, a5) => (dynCall_viidii = Module["dynCall_viidii"] = wasmExports["qc"])(a0, a1, a2, a3, a4, a5); - -var _asyncify_start_unwind = a0 => (_asyncify_start_unwind = wasmExports["rc"])(a0); - -var _asyncify_stop_unwind = () => (_asyncify_stop_unwind = wasmExports["sc"])(); - -var _asyncify_start_rewind = a0 => (_asyncify_start_rewind = wasmExports["tc"])(a0); - -var _asyncify_stop_rewind = () => (_asyncify_stop_rewind = wasmExports["uc"])(); - -function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vi(index, a1) { - var sp = stackSave(); - try { - dynCall_vi(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiii(index, a1, a2, a3) { - var sp = stackSave(); - try { - return dynCall_iiii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_iii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_vii(index, a1, a2) { - var sp = stackSave(); - try { - dynCall_vii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_ii(index, a1) { - var sp = stackSave(); - try { - return dynCall_ii(index, a1); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viii(index, a1, a2, a3) { - var sp = stackSave(); - try { - dynCall_viii(index, a1, a2, a3); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_v(index) { - var sp = stackSave(); - try { - dynCall_v(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_i(index) { - var sp = stackSave(); - try { - return dynCall_i(index); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - dynCall_viiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - return dynCall_iiiiii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiii(index, a1, a2, a3, a4) { - var sp = stackSave(); - try { - return dynCall_iiiii(index, a1, a2, a3, a4); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - return dynCall_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viidii(index, a1, a2, a3, a4, a5) { - var sp = stackSave(); - try { - dynCall_viidii(index, a1, a2, a3, a4, a5); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { - var sp = stackSave(); - try { - dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - var sp = stackSave(); - try { - dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { - var sp = stackSave(); - try { - dynCall_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -function invoke_jii(index, a1, a2) { - var sp = stackSave(); - try { - return dynCall_jii(index, a1, a2); - } catch (e) { - stackRestore(sp); - if (e !== e + 0) throw e; - _setThrew(1, 0); - } -} - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['Hb'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['Ib'])(a0)); + + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['Jb'])(a0)); + + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['Kb'])(a0)); + + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = wasmExports['Lb'])( + a0 + )); + + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['Mb'])(a0)); + + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['Nb'])()); + + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['Ob'])()); + + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = wasmExports['Pb'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['Qb'])(a0)); + + var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports['Rb'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = wasmExports['Sb'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['Tb'])(a0, a1); + + var _setThrew = (a0, a1) => (_setThrew = wasmExports['Ub'])(a0, a1); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['Vb'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['Wb'])(a0); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['Xb'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = wasmExports['Yb'])(); + + var dynCall_iiii = (Module['dynCall_iiii'] = (a0, a1, a2, a3) => + (dynCall_iiii = Module['dynCall_iiii'] = wasmExports['Zb'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_ii = (Module['dynCall_ii'] = (a0, a1) => + (dynCall_ii = Module['dynCall_ii'] = wasmExports['_b'])(a0, a1)); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['$b'])(a0, a1)); + + var dynCall_vii = (Module['dynCall_vii'] = (a0, a1, a2) => + (dynCall_vii = Module['dynCall_vii'] = wasmExports['ac'])(a0, a1, a2)); + + var dynCall_viiiii = (Module['dynCall_viiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viiiii = Module['dynCall_viiiii'] = wasmExports['bc'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_iii = (Module['dynCall_iii'] = (a0, a1, a2) => + (dynCall_iii = Module['dynCall_iii'] = wasmExports['cc'])(a0, a1, a2)); + + var dynCall_iiiii = (Module['dynCall_iiiii'] = (a0, a1, a2, a3, a4) => + (dynCall_iiiii = Module['dynCall_iiiii'] = wasmExports['dc'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iiiiii = (Module['dynCall_iiiiii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_iiiiii = Module['dynCall_iiiiii'] = wasmExports['ec'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var dynCall_viii = (Module['dynCall_viii'] = (a0, a1, a2, a3) => + (dynCall_viii = Module['dynCall_viii'] = wasmExports['fc'])( + a0, + a1, + a2, + a3 + )); + + var dynCall_v = (Module['dynCall_v'] = (a0) => + (dynCall_v = Module['dynCall_v'] = wasmExports['gc'])(a0)); + + var dynCall_i = (Module['dynCall_i'] = (a0) => + (dynCall_i = Module['dynCall_i'] = wasmExports['hc'])(a0)); + + var dynCall_viiii = (Module['dynCall_viiii'] = (a0, a1, a2, a3, a4) => + (dynCall_viiii = Module['dynCall_viiii'] = wasmExports['ic'])( + a0, + a1, + a2, + a3, + a4 + )); + + var dynCall_iiiiiii = (Module['dynCall_iiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_iiiiiii = Module['dynCall_iiiiiii'] = wasmExports['jc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_viiiiiiiii = (Module['dynCall_viiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_viiiiiiiii = Module['dynCall_viiiiiiiii'] = wasmExports['kc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_viiiiiii = (Module['dynCall_viiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_viiiiiii = Module['dynCall_viiiiiii'] = wasmExports['lc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_viiiiii = (Module['dynCall_viiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + ) => + (dynCall_viiiiii = Module['dynCall_viiiiii'] = wasmExports['mc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6 + )); + + var dynCall_iiiiiiii = (Module['dynCall_iiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + ) => + (dynCall_iiiiiiii = Module['dynCall_iiiiiiii'] = wasmExports['nc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7 + )); + + var dynCall_iiiiiiiiii = (Module['dynCall_iiiiiiiiii'] = ( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ) => + (dynCall_iiiiiiiiii = Module['dynCall_iiiiiiiiii'] = wasmExports['oc'])( + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + )); + + var dynCall_jii = (Module['dynCall_jii'] = (a0, a1, a2) => + (dynCall_jii = Module['dynCall_jii'] = wasmExports['pc'])(a0, a1, a2)); + + var dynCall_viidii = (Module['dynCall_viidii'] = (a0, a1, a2, a3, a4, a5) => + (dynCall_viidii = Module['dynCall_viidii'] = wasmExports['qc'])( + a0, + a1, + a2, + a3, + a4, + a5 + )); + + var _asyncify_start_unwind = (a0) => + (_asyncify_start_unwind = wasmExports['rc'])(a0); + + var _asyncify_stop_unwind = () => + (_asyncify_stop_unwind = wasmExports['sc'])(); + + var _asyncify_start_rewind = (a0) => + (_asyncify_start_rewind = wasmExports['tc'])(a0); + + var _asyncify_stop_rewind = () => + (_asyncify_stop_rewind = wasmExports['uc'])(); + + function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vi(index, a1) { + var sp = stackSave(); + try { + dynCall_vi(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiii(index, a1, a2, a3) { + var sp = stackSave(); + try { + return dynCall_iiii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_iii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_vii(index, a1, a2) { + var sp = stackSave(); + try { + dynCall_vii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_ii(index, a1) { + var sp = stackSave(); + try { + return dynCall_ii(index, a1); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viii(index, a1, a2, a3) { + var sp = stackSave(); + try { + dynCall_viii(index, a1, a2, a3); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_v(index) { + var sp = stackSave(); + try { + dynCall_v(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_i(index) { + var sp = stackSave(); + try { + return dynCall_i(index); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + dynCall_viiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + return dynCall_iiiiii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiii(index, a1, a2, a3, a4) { + var sp = stackSave(); + try { + return dynCall_iiiii(index, a1, a2, a3, a4); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + return dynCall_iiiiiiiiii( + index, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9 + ); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viidii(index, a1, a2, a3, a4, a5) { + var sp = stackSave(); + try { + dynCall_viidii(index, a1, a2, a3, a4, a5); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) { + var sp = stackSave(); + try { + dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + var sp = stackSave(); + try { + dynCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + return dynCall_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7) { + var sp = stackSave(); + try { + dynCall_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + function invoke_jii(index, a1, a2) { + var sp = stackSave(); + try { + return dynCall_jii(index, a1, a2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + } + } + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/jspi/php_7_0.js b/packages/php-wasm/node/jspi/php_7_0.js index 5778b6168a..6c8c87c97c 100644 --- a/packages/php-wasm/node/jspi/php_7_0.js +++ b/packages/php-wasm/node/jspi/php_7_0.js @@ -1,6618 +1,7668 @@ -const dependencyFilename = __dirname + '/7_0_33/php_7_0.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 12843113; +const dependencyFilename = __dirname + '/7_0_33/php_7_0.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 12843113; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - if (runtimeInitialized) { - ___trap(); - } - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - Asyncify.instrumentWasmImports(wasmImports); - return { - "env": wasmImports, - "wasi_snapshot_preview1": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["memory"]; - updateMemoryViews(); - addOnInit(wasmExports["__wasm_call_ctors"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); - }); -} - -__asyncjs__js_popen_to_file.sig = "iiii"; - -function __asyncjs__wasm_poll_socket(socketd, events, timeout) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); - }); -} - -__asyncjs__wasm_poll_socket.sig = "iiii"; - -function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); - }); -} - -__asyncjs__js_fd_read.sig = "iiiii"; - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -__asyncjs__js_module_onMessage.sig = "iii"; - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - if (typeof data === "number") { - data = new Uint8Array([ data ]); - } - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + if (runtimeInitialized) { + ___trap(); + } + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + Asyncify.instrumentWasmImports(wasmImports); + return { + env: wasmImports, + wasi_snapshot_preview1: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['memory']; + updateMemoryViews(); + addOnInit(wasmExports['__wasm_call_ctors']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce( + (acc, curr) => acc + curr.length, + 0 + ) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + }); + } + + __asyncjs__js_popen_to_file.sig = 'iiii'; + + function __asyncjs__wasm_poll_socket(socketd, events, timeout) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => + polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + }); + } + + __asyncjs__wasm_poll_socket.sig = 'iiii'; + + function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + }); + } + + __asyncjs__js_fd_read.sig = 'iiiii'; + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + __asyncjs__js_module_onMessage.sig = 'iii'; + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + if (typeof data === 'number') { + data = new Uint8Array([data]); + } + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6623,485 +7673,599 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - if (isAsyncifyImport) { - imports[x] = original = new WebAssembly.Suspending(original); - } - } - } - }, - instrumentWasmExports(exports) { - var exportPattern = /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; - Asyncify.asyncExports = new Set; - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - let isAsyncifyExport = exportPattern.test(x); - if (isAsyncifyExport) { - Asyncify.asyncExports.add(original); - original = Asyncify.makeAsyncFunction(original); - } - ret[x] = (...args) => original(...args); - } else { - ret[x] = original; - } - } - return ret; - }, - asyncExports: null, - isAsyncExport(func) { - return Asyncify.asyncExports?.has(func); - }, - handleAsync: async startAsync => { - runtimeKeepalivePush(); - try { - return await startAsync(); - } finally { - runtimeKeepalivePop(); - } - }, - handleSleep(startAsync) { - return Asyncify.handleAsync(() => new Promise(startAsync)); - }, - makeAsyncFunction(original) { - return WebAssembly.promising(original); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -var stackSave = () => _emscripten_stack_get_current(); - -var stackRestore = val => __emscripten_stack_restore(val); - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func(...cArgs); - function onDone(ret) { - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - if (asyncMode) return ret.then(onDone); - ret = onDone(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ __assert_fail: ___assert_fail, - /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, - /** @export */ __asyncjs__js_module_onMessage: __asyncjs__js_module_onMessage, - /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, - /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, - /** @export */ __call_sighandler: ___call_sighandler, - /** @export */ __syscall_accept4: ___syscall_accept4, - /** @export */ __syscall_bind: ___syscall_bind, - /** @export */ __syscall_chdir: ___syscall_chdir, - /** @export */ __syscall_chmod: ___syscall_chmod, - /** @export */ __syscall_connect: ___syscall_connect, - /** @export */ __syscall_dup: ___syscall_dup, - /** @export */ __syscall_dup3: ___syscall_dup3, - /** @export */ __syscall_faccessat: ___syscall_faccessat, - /** @export */ __syscall_fchmod: ___syscall_fchmod, - /** @export */ __syscall_fchown32: ___syscall_fchown32, - /** @export */ __syscall_fchownat: ___syscall_fchownat, - /** @export */ __syscall_fcntl64: ___syscall_fcntl64, - /** @export */ __syscall_fstat64: ___syscall_fstat64, - /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, - /** @export */ __syscall_getcwd: ___syscall_getcwd, - /** @export */ __syscall_getdents64: ___syscall_getdents64, - /** @export */ __syscall_getpeername: ___syscall_getpeername, - /** @export */ __syscall_getsockname: ___syscall_getsockname, - /** @export */ __syscall_getsockopt: ___syscall_getsockopt, - /** @export */ __syscall_ioctl: ___syscall_ioctl, - /** @export */ __syscall_listen: ___syscall_listen, - /** @export */ __syscall_lstat64: ___syscall_lstat64, - /** @export */ __syscall_mkdirat: ___syscall_mkdirat, - /** @export */ __syscall_newfstatat: ___syscall_newfstatat, - /** @export */ __syscall_openat: ___syscall_openat, - /** @export */ __syscall_pipe: ___syscall_pipe, - /** @export */ __syscall_poll: ___syscall_poll, - /** @export */ __syscall_readlinkat: ___syscall_readlinkat, - /** @export */ __syscall_recvfrom: ___syscall_recvfrom, - /** @export */ __syscall_renameat: ___syscall_renameat, - /** @export */ __syscall_rmdir: ___syscall_rmdir, - /** @export */ __syscall_sendto: ___syscall_sendto, - /** @export */ __syscall_socket: ___syscall_socket, - /** @export */ __syscall_stat64: ___syscall_stat64, - /** @export */ __syscall_statfs64: ___syscall_statfs64, - /** @export */ __syscall_symlink: ___syscall_symlink, - /** @export */ __syscall_unlinkat: ___syscall_unlinkat, - /** @export */ __syscall_utimensat: ___syscall_utimensat, - /** @export */ _abort_js: __abort_js, - /** @export */ _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic, - /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, - /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, - /** @export */ _emscripten_runtime_keepalive_clear: __emscripten_runtime_keepalive_clear, - /** @export */ _gmtime_js: __gmtime_js, - /** @export */ _localtime_js: __localtime_js, - /** @export */ _mktime_js: __mktime_js, - /** @export */ _mmap_js: __mmap_js, - /** @export */ _munmap_js: __munmap_js, - /** @export */ _setitimer_js: __setitimer_js, - /** @export */ _tzset_js: __tzset_js, - /** @export */ emscripten_date_now: _emscripten_date_now, - /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, - /** @export */ emscripten_get_now: _emscripten_get_now, - /** @export */ emscripten_resize_heap: _emscripten_resize_heap, - /** @export */ emscripten_sleep: _emscripten_sleep, - /** @export */ environ_get: _environ_get, - /** @export */ environ_sizes_get: _environ_sizes_get, - /** @export */ exit: _exit, - /** @export */ fd_close: _fd_close, - /** @export */ fd_fdstat_get: _fd_fdstat_get, - /** @export */ fd_read: _fd_read, - /** @export */ fd_seek: _fd_seek, - /** @export */ fd_sync: _fd_sync, - /** @export */ fd_write: _fd_write, - /** @export */ getaddrinfo: _getaddrinfo, - /** @export */ getnameinfo: _getnameinfo, - /** @export */ getprotobyname: _getprotobyname, - /** @export */ getprotobynumber: _getprotobynumber, - /** @export */ js_create_input_device: _js_create_input_device, - /** @export */ js_open_process: _js_open_process, - /** @export */ js_process_status: _js_process_status, - /** @export */ js_waitpid: _js_waitpid, - /** @export */ proc_exit: _proc_exit, - /** @export */ strftime: _strftime, - /** @export */ strftime_l: _strftime_l, - /** @export */ strptime: _strptime, - /** @export */ wasm_close: _wasm_close, - /** @export */ wasm_setsockopt: _wasm_setsockopt -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["__wasm_call_ctors"])(); - -var _malloc = a0 => (_malloc = wasmExports["malloc"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["wasm_sleep"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["ntohs"])(a0); - -var _htons = a0 => (_htons = wasmExports["htons"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["htonl"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["wasm_read"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["fflush"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["wasm_popen"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["wasm_php_exec"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["php_pollfd_for"])(a0, a1, a2); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["__wrap_select"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["wasm_add_cli_arg"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["run_cli"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["wasm_set_sapi_name"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["wasm_set_phpini_path"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["wasm_add_SERVER_entry"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["wasm_add_ENV_entry"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["wasm_set_query_string"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["wasm_set_path_translated"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["wasm_set_skip_shebang"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["wasm_set_request_uri"])(a0); - -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["wasm_set_request_method"])(a0); - -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["wasm_set_request_host"])(a0); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + if (isAsyncifyImport) { + imports[x] = original = new WebAssembly.Suspending( + original + ); + } + } + } + }, + instrumentWasmExports(exports) { + var exportPattern = + /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; + Asyncify.asyncExports = new Set(); + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + let isAsyncifyExport = exportPattern.test(x); + if (isAsyncifyExport) { + Asyncify.asyncExports.add(original); + original = Asyncify.makeAsyncFunction(original); + } + ret[x] = (...args) => original(...args); + } else { + ret[x] = original; + } + } + return ret; + }, + asyncExports: null, + isAsyncExport(func) { + return Asyncify.asyncExports?.has(func); + }, + handleAsync: async (startAsync) => { + runtimeKeepalivePush(); + try { + return await startAsync(); + } finally { + runtimeKeepalivePop(); + } + }, + handleSleep(startAsync) { + return Asyncify.handleAsync(() => new Promise(startAsync)); + }, + makeAsyncFunction(original) { + return WebAssembly.promising(original); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + var stackSave = () => _emscripten_stack_get_current(); + + var stackRestore = (val) => __emscripten_stack_restore(val); + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func(...cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + if (asyncMode) return ret.then(onDone); + ret = onDone(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ __assert_fail: ___assert_fail, + /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, + /** @export */ __asyncjs__js_module_onMessage: + __asyncjs__js_module_onMessage, + /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, + /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, + /** @export */ __call_sighandler: ___call_sighandler, + /** @export */ __syscall_accept4: ___syscall_accept4, + /** @export */ __syscall_bind: ___syscall_bind, + /** @export */ __syscall_chdir: ___syscall_chdir, + /** @export */ __syscall_chmod: ___syscall_chmod, + /** @export */ __syscall_connect: ___syscall_connect, + /** @export */ __syscall_dup: ___syscall_dup, + /** @export */ __syscall_dup3: ___syscall_dup3, + /** @export */ __syscall_faccessat: ___syscall_faccessat, + /** @export */ __syscall_fchmod: ___syscall_fchmod, + /** @export */ __syscall_fchown32: ___syscall_fchown32, + /** @export */ __syscall_fchownat: ___syscall_fchownat, + /** @export */ __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ __syscall_fstat64: ___syscall_fstat64, + /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, + /** @export */ __syscall_getcwd: ___syscall_getcwd, + /** @export */ __syscall_getdents64: ___syscall_getdents64, + /** @export */ __syscall_getpeername: ___syscall_getpeername, + /** @export */ __syscall_getsockname: ___syscall_getsockname, + /** @export */ __syscall_getsockopt: ___syscall_getsockopt, + /** @export */ __syscall_ioctl: ___syscall_ioctl, + /** @export */ __syscall_listen: ___syscall_listen, + /** @export */ __syscall_lstat64: ___syscall_lstat64, + /** @export */ __syscall_mkdirat: ___syscall_mkdirat, + /** @export */ __syscall_newfstatat: ___syscall_newfstatat, + /** @export */ __syscall_openat: ___syscall_openat, + /** @export */ __syscall_pipe: ___syscall_pipe, + /** @export */ __syscall_poll: ___syscall_poll, + /** @export */ __syscall_readlinkat: ___syscall_readlinkat, + /** @export */ __syscall_recvfrom: ___syscall_recvfrom, + /** @export */ __syscall_renameat: ___syscall_renameat, + /** @export */ __syscall_rmdir: ___syscall_rmdir, + /** @export */ __syscall_sendto: ___syscall_sendto, + /** @export */ __syscall_socket: ___syscall_socket, + /** @export */ __syscall_stat64: ___syscall_stat64, + /** @export */ __syscall_statfs64: ___syscall_statfs64, + /** @export */ __syscall_symlink: ___syscall_symlink, + /** @export */ __syscall_unlinkat: ___syscall_unlinkat, + /** @export */ __syscall_utimensat: ___syscall_utimensat, + /** @export */ _abort_js: __abort_js, + /** @export */ _emscripten_get_now_is_monotonic: + __emscripten_get_now_is_monotonic, + /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, + /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, + /** @export */ _emscripten_runtime_keepalive_clear: + __emscripten_runtime_keepalive_clear, + /** @export */ _gmtime_js: __gmtime_js, + /** @export */ _localtime_js: __localtime_js, + /** @export */ _mktime_js: __mktime_js, + /** @export */ _mmap_js: __mmap_js, + /** @export */ _munmap_js: __munmap_js, + /** @export */ _setitimer_js: __setitimer_js, + /** @export */ _tzset_js: __tzset_js, + /** @export */ emscripten_date_now: _emscripten_date_now, + /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, + /** @export */ emscripten_get_now: _emscripten_get_now, + /** @export */ emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ emscripten_sleep: _emscripten_sleep, + /** @export */ environ_get: _environ_get, + /** @export */ environ_sizes_get: _environ_sizes_get, + /** @export */ exit: _exit, + /** @export */ fd_close: _fd_close, + /** @export */ fd_fdstat_get: _fd_fdstat_get, + /** @export */ fd_read: _fd_read, + /** @export */ fd_seek: _fd_seek, + /** @export */ fd_sync: _fd_sync, + /** @export */ fd_write: _fd_write, + /** @export */ getaddrinfo: _getaddrinfo, + /** @export */ getnameinfo: _getnameinfo, + /** @export */ getprotobyname: _getprotobyname, + /** @export */ getprotobynumber: _getprotobynumber, + /** @export */ js_create_input_device: _js_create_input_device, + /** @export */ js_open_process: _js_open_process, + /** @export */ js_process_status: _js_process_status, + /** @export */ js_waitpid: _js_waitpid, + /** @export */ proc_exit: _proc_exit, + /** @export */ strftime: _strftime, + /** @export */ strftime_l: _strftime_l, + /** @export */ strptime: _strptime, + /** @export */ wasm_close: _wasm_close, + /** @export */ wasm_setsockopt: _wasm_setsockopt, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => + (___wasm_call_ctors = wasmExports['__wasm_call_ctors'])(); + + var _malloc = (a0) => (_malloc = wasmExports['malloc'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['wasm_sleep'])(a0)); + + var _ntohs = (a0) => (_ntohs = wasmExports['ntohs'])(a0); + + var _htons = (a0) => (_htons = wasmExports['htons'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['htonl'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['wasm_read'])( + a0, + a1, + a2 + )); + + var _fflush = (a0) => (_fflush = wasmExports['fflush'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['wasm_popen'])( + a0, + a1 + )); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = + wasmExports['wasm_php_exec'])(a0, a1, a2, a3)); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = + wasmExports['php_pollfd_for'])(a0, a1, a2)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = + wasmExports['__wrap_select'])(a0, a1, a2, a3, a4)); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = + wasmExports['wasm_add_cli_arg'])(a0)); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['run_cli'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['wasm_set_sapi_name'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['wasm_set_phpini_path'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['wasm_add_SERVER_entry'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['wasm_add_ENV_entry'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['wasm_set_query_string'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['wasm_set_path_translated'])(a0)); -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["wasm_set_content_type"])(a0); + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['wasm_set_skip_shebang'])(a0)); -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["wasm_set_request_body"])(a0); + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['wasm_set_request_uri'])(a0)); -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["wasm_set_content_length"])(a0); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['wasm_set_request_method'])(a0)); -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["wasm_set_cookies"])(a0); + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['wasm_set_request_host'])(a0)); -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["wasm_set_request_port"])(a0); + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['wasm_set_content_type'])(a0)); -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["wasm_sapi_request_shutdown"])(); + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['wasm_set_request_body'])(a0)); -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["wasm_sapi_handle_request"])(); + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['wasm_set_content_length'])(a0)); -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["php_wasm_init"])(); + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = + wasmExports['wasm_set_cookies'])(a0)); -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["wasm_free"])(a0); + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['wasm_set_request_port'])(a0)); -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["__funcs_on_exit"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["emscripten_builtin_memalign"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["_emscripten_timeout"])(a0, a1); - -var ___trap = () => (___trap = wasmExports["__trap"])(); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["_emscripten_tempret_set"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"])(); - -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["dynCall_vi"])(a0, a1); - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['wasm_sapi_request_shutdown'])()); + + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['wasm_sapi_handle_request'])()); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = + wasmExports['php_wasm_init'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['wasm_free'])(a0)); + + var ___funcs_on_exit = () => + (___funcs_on_exit = wasmExports['__funcs_on_exit'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = + wasmExports['emscripten_builtin_memalign'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['_emscripten_timeout'])(a0, a1); + + var ___trap = () => (___trap = wasmExports['__trap'])(); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['_emscripten_tempret_set'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['_emscripten_stack_restore'])( + a0 + ); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = + wasmExports['emscripten_stack_get_current'])(); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['dynCall_vi'])( + a0, + a1 + )); + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/jspi/php_7_1.js b/packages/php-wasm/node/jspi/php_7_1.js index c75fff8a8f..b6af4624c5 100644 --- a/packages/php-wasm/node/jspi/php_7_1.js +++ b/packages/php-wasm/node/jspi/php_7_1.js @@ -1,6618 +1,7668 @@ -const dependencyFilename = __dirname + '/7_1_30/php_7_1.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 13321802; +const dependencyFilename = __dirname + '/7_1_30/php_7_1.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 13321802; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - if (runtimeInitialized) { - ___trap(); - } - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - Asyncify.instrumentWasmImports(wasmImports); - return { - "env": wasmImports, - "wasi_snapshot_preview1": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["memory"]; - updateMemoryViews(); - addOnInit(wasmExports["__wasm_call_ctors"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); - }); -} - -__asyncjs__js_popen_to_file.sig = "iiii"; - -function __asyncjs__wasm_poll_socket(socketd, events, timeout) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); - }); -} - -__asyncjs__wasm_poll_socket.sig = "iiii"; - -function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); - }); -} - -__asyncjs__js_fd_read.sig = "iiiii"; - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -__asyncjs__js_module_onMessage.sig = "iii"; - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - if (typeof data === "number") { - data = new Uint8Array([ data ]); - } - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + if (runtimeInitialized) { + ___trap(); + } + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + Asyncify.instrumentWasmImports(wasmImports); + return { + env: wasmImports, + wasi_snapshot_preview1: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['memory']; + updateMemoryViews(); + addOnInit(wasmExports['__wasm_call_ctors']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce( + (acc, curr) => acc + curr.length, + 0 + ) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + }); + } + + __asyncjs__js_popen_to_file.sig = 'iiii'; + + function __asyncjs__wasm_poll_socket(socketd, events, timeout) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => + polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + }); + } + + __asyncjs__wasm_poll_socket.sig = 'iiii'; + + function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + }); + } + + __asyncjs__js_fd_read.sig = 'iiiii'; + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + __asyncjs__js_module_onMessage.sig = 'iii'; + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + if (typeof data === 'number') { + data = new Uint8Array([data]); + } + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6623,485 +7673,599 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - if (isAsyncifyImport) { - imports[x] = original = new WebAssembly.Suspending(original); - } - } - } - }, - instrumentWasmExports(exports) { - var exportPattern = /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; - Asyncify.asyncExports = new Set; - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - let isAsyncifyExport = exportPattern.test(x); - if (isAsyncifyExport) { - Asyncify.asyncExports.add(original); - original = Asyncify.makeAsyncFunction(original); - } - ret[x] = (...args) => original(...args); - } else { - ret[x] = original; - } - } - return ret; - }, - asyncExports: null, - isAsyncExport(func) { - return Asyncify.asyncExports?.has(func); - }, - handleAsync: async startAsync => { - runtimeKeepalivePush(); - try { - return await startAsync(); - } finally { - runtimeKeepalivePop(); - } - }, - handleSleep(startAsync) { - return Asyncify.handleAsync(() => new Promise(startAsync)); - }, - makeAsyncFunction(original) { - return WebAssembly.promising(original); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -var stackSave = () => _emscripten_stack_get_current(); - -var stackRestore = val => __emscripten_stack_restore(val); - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func(...cArgs); - function onDone(ret) { - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - if (asyncMode) return ret.then(onDone); - ret = onDone(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ __assert_fail: ___assert_fail, - /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, - /** @export */ __asyncjs__js_module_onMessage: __asyncjs__js_module_onMessage, - /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, - /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, - /** @export */ __call_sighandler: ___call_sighandler, - /** @export */ __syscall_accept4: ___syscall_accept4, - /** @export */ __syscall_bind: ___syscall_bind, - /** @export */ __syscall_chdir: ___syscall_chdir, - /** @export */ __syscall_chmod: ___syscall_chmod, - /** @export */ __syscall_connect: ___syscall_connect, - /** @export */ __syscall_dup: ___syscall_dup, - /** @export */ __syscall_dup3: ___syscall_dup3, - /** @export */ __syscall_faccessat: ___syscall_faccessat, - /** @export */ __syscall_fchmod: ___syscall_fchmod, - /** @export */ __syscall_fchown32: ___syscall_fchown32, - /** @export */ __syscall_fchownat: ___syscall_fchownat, - /** @export */ __syscall_fcntl64: ___syscall_fcntl64, - /** @export */ __syscall_fstat64: ___syscall_fstat64, - /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, - /** @export */ __syscall_getcwd: ___syscall_getcwd, - /** @export */ __syscall_getdents64: ___syscall_getdents64, - /** @export */ __syscall_getpeername: ___syscall_getpeername, - /** @export */ __syscall_getsockname: ___syscall_getsockname, - /** @export */ __syscall_getsockopt: ___syscall_getsockopt, - /** @export */ __syscall_ioctl: ___syscall_ioctl, - /** @export */ __syscall_listen: ___syscall_listen, - /** @export */ __syscall_lstat64: ___syscall_lstat64, - /** @export */ __syscall_mkdirat: ___syscall_mkdirat, - /** @export */ __syscall_newfstatat: ___syscall_newfstatat, - /** @export */ __syscall_openat: ___syscall_openat, - /** @export */ __syscall_pipe: ___syscall_pipe, - /** @export */ __syscall_poll: ___syscall_poll, - /** @export */ __syscall_readlinkat: ___syscall_readlinkat, - /** @export */ __syscall_recvfrom: ___syscall_recvfrom, - /** @export */ __syscall_renameat: ___syscall_renameat, - /** @export */ __syscall_rmdir: ___syscall_rmdir, - /** @export */ __syscall_sendto: ___syscall_sendto, - /** @export */ __syscall_socket: ___syscall_socket, - /** @export */ __syscall_stat64: ___syscall_stat64, - /** @export */ __syscall_statfs64: ___syscall_statfs64, - /** @export */ __syscall_symlink: ___syscall_symlink, - /** @export */ __syscall_unlinkat: ___syscall_unlinkat, - /** @export */ __syscall_utimensat: ___syscall_utimensat, - /** @export */ _abort_js: __abort_js, - /** @export */ _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic, - /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, - /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, - /** @export */ _emscripten_runtime_keepalive_clear: __emscripten_runtime_keepalive_clear, - /** @export */ _gmtime_js: __gmtime_js, - /** @export */ _localtime_js: __localtime_js, - /** @export */ _mktime_js: __mktime_js, - /** @export */ _mmap_js: __mmap_js, - /** @export */ _munmap_js: __munmap_js, - /** @export */ _setitimer_js: __setitimer_js, - /** @export */ _tzset_js: __tzset_js, - /** @export */ emscripten_date_now: _emscripten_date_now, - /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, - /** @export */ emscripten_get_now: _emscripten_get_now, - /** @export */ emscripten_resize_heap: _emscripten_resize_heap, - /** @export */ emscripten_sleep: _emscripten_sleep, - /** @export */ environ_get: _environ_get, - /** @export */ environ_sizes_get: _environ_sizes_get, - /** @export */ exit: _exit, - /** @export */ fd_close: _fd_close, - /** @export */ fd_fdstat_get: _fd_fdstat_get, - /** @export */ fd_read: _fd_read, - /** @export */ fd_seek: _fd_seek, - /** @export */ fd_sync: _fd_sync, - /** @export */ fd_write: _fd_write, - /** @export */ getaddrinfo: _getaddrinfo, - /** @export */ getnameinfo: _getnameinfo, - /** @export */ getprotobyname: _getprotobyname, - /** @export */ getprotobynumber: _getprotobynumber, - /** @export */ js_create_input_device: _js_create_input_device, - /** @export */ js_open_process: _js_open_process, - /** @export */ js_process_status: _js_process_status, - /** @export */ js_waitpid: _js_waitpid, - /** @export */ proc_exit: _proc_exit, - /** @export */ strftime: _strftime, - /** @export */ strftime_l: _strftime_l, - /** @export */ strptime: _strptime, - /** @export */ wasm_close: _wasm_close, - /** @export */ wasm_setsockopt: _wasm_setsockopt -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["__wasm_call_ctors"])(); - -var _malloc = a0 => (_malloc = wasmExports["malloc"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["wasm_sleep"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["ntohs"])(a0); - -var _htons = a0 => (_htons = wasmExports["htons"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["htonl"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["wasm_read"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["fflush"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["wasm_popen"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["wasm_php_exec"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["php_pollfd_for"])(a0, a1, a2); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["__wrap_select"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["wasm_add_cli_arg"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["run_cli"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["wasm_set_sapi_name"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["wasm_set_phpini_path"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["wasm_add_SERVER_entry"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["wasm_add_ENV_entry"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["wasm_set_query_string"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["wasm_set_path_translated"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["wasm_set_skip_shebang"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["wasm_set_request_uri"])(a0); - -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["wasm_set_request_method"])(a0); - -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["wasm_set_request_host"])(a0); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + if (isAsyncifyImport) { + imports[x] = original = new WebAssembly.Suspending( + original + ); + } + } + } + }, + instrumentWasmExports(exports) { + var exportPattern = + /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; + Asyncify.asyncExports = new Set(); + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + let isAsyncifyExport = exportPattern.test(x); + if (isAsyncifyExport) { + Asyncify.asyncExports.add(original); + original = Asyncify.makeAsyncFunction(original); + } + ret[x] = (...args) => original(...args); + } else { + ret[x] = original; + } + } + return ret; + }, + asyncExports: null, + isAsyncExport(func) { + return Asyncify.asyncExports?.has(func); + }, + handleAsync: async (startAsync) => { + runtimeKeepalivePush(); + try { + return await startAsync(); + } finally { + runtimeKeepalivePop(); + } + }, + handleSleep(startAsync) { + return Asyncify.handleAsync(() => new Promise(startAsync)); + }, + makeAsyncFunction(original) { + return WebAssembly.promising(original); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + var stackSave = () => _emscripten_stack_get_current(); + + var stackRestore = (val) => __emscripten_stack_restore(val); + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func(...cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + if (asyncMode) return ret.then(onDone); + ret = onDone(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ __assert_fail: ___assert_fail, + /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, + /** @export */ __asyncjs__js_module_onMessage: + __asyncjs__js_module_onMessage, + /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, + /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, + /** @export */ __call_sighandler: ___call_sighandler, + /** @export */ __syscall_accept4: ___syscall_accept4, + /** @export */ __syscall_bind: ___syscall_bind, + /** @export */ __syscall_chdir: ___syscall_chdir, + /** @export */ __syscall_chmod: ___syscall_chmod, + /** @export */ __syscall_connect: ___syscall_connect, + /** @export */ __syscall_dup: ___syscall_dup, + /** @export */ __syscall_dup3: ___syscall_dup3, + /** @export */ __syscall_faccessat: ___syscall_faccessat, + /** @export */ __syscall_fchmod: ___syscall_fchmod, + /** @export */ __syscall_fchown32: ___syscall_fchown32, + /** @export */ __syscall_fchownat: ___syscall_fchownat, + /** @export */ __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ __syscall_fstat64: ___syscall_fstat64, + /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, + /** @export */ __syscall_getcwd: ___syscall_getcwd, + /** @export */ __syscall_getdents64: ___syscall_getdents64, + /** @export */ __syscall_getpeername: ___syscall_getpeername, + /** @export */ __syscall_getsockname: ___syscall_getsockname, + /** @export */ __syscall_getsockopt: ___syscall_getsockopt, + /** @export */ __syscall_ioctl: ___syscall_ioctl, + /** @export */ __syscall_listen: ___syscall_listen, + /** @export */ __syscall_lstat64: ___syscall_lstat64, + /** @export */ __syscall_mkdirat: ___syscall_mkdirat, + /** @export */ __syscall_newfstatat: ___syscall_newfstatat, + /** @export */ __syscall_openat: ___syscall_openat, + /** @export */ __syscall_pipe: ___syscall_pipe, + /** @export */ __syscall_poll: ___syscall_poll, + /** @export */ __syscall_readlinkat: ___syscall_readlinkat, + /** @export */ __syscall_recvfrom: ___syscall_recvfrom, + /** @export */ __syscall_renameat: ___syscall_renameat, + /** @export */ __syscall_rmdir: ___syscall_rmdir, + /** @export */ __syscall_sendto: ___syscall_sendto, + /** @export */ __syscall_socket: ___syscall_socket, + /** @export */ __syscall_stat64: ___syscall_stat64, + /** @export */ __syscall_statfs64: ___syscall_statfs64, + /** @export */ __syscall_symlink: ___syscall_symlink, + /** @export */ __syscall_unlinkat: ___syscall_unlinkat, + /** @export */ __syscall_utimensat: ___syscall_utimensat, + /** @export */ _abort_js: __abort_js, + /** @export */ _emscripten_get_now_is_monotonic: + __emscripten_get_now_is_monotonic, + /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, + /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, + /** @export */ _emscripten_runtime_keepalive_clear: + __emscripten_runtime_keepalive_clear, + /** @export */ _gmtime_js: __gmtime_js, + /** @export */ _localtime_js: __localtime_js, + /** @export */ _mktime_js: __mktime_js, + /** @export */ _mmap_js: __mmap_js, + /** @export */ _munmap_js: __munmap_js, + /** @export */ _setitimer_js: __setitimer_js, + /** @export */ _tzset_js: __tzset_js, + /** @export */ emscripten_date_now: _emscripten_date_now, + /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, + /** @export */ emscripten_get_now: _emscripten_get_now, + /** @export */ emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ emscripten_sleep: _emscripten_sleep, + /** @export */ environ_get: _environ_get, + /** @export */ environ_sizes_get: _environ_sizes_get, + /** @export */ exit: _exit, + /** @export */ fd_close: _fd_close, + /** @export */ fd_fdstat_get: _fd_fdstat_get, + /** @export */ fd_read: _fd_read, + /** @export */ fd_seek: _fd_seek, + /** @export */ fd_sync: _fd_sync, + /** @export */ fd_write: _fd_write, + /** @export */ getaddrinfo: _getaddrinfo, + /** @export */ getnameinfo: _getnameinfo, + /** @export */ getprotobyname: _getprotobyname, + /** @export */ getprotobynumber: _getprotobynumber, + /** @export */ js_create_input_device: _js_create_input_device, + /** @export */ js_open_process: _js_open_process, + /** @export */ js_process_status: _js_process_status, + /** @export */ js_waitpid: _js_waitpid, + /** @export */ proc_exit: _proc_exit, + /** @export */ strftime: _strftime, + /** @export */ strftime_l: _strftime_l, + /** @export */ strptime: _strptime, + /** @export */ wasm_close: _wasm_close, + /** @export */ wasm_setsockopt: _wasm_setsockopt, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => + (___wasm_call_ctors = wasmExports['__wasm_call_ctors'])(); + + var _malloc = (a0) => (_malloc = wasmExports['malloc'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['wasm_sleep'])(a0)); + + var _ntohs = (a0) => (_ntohs = wasmExports['ntohs'])(a0); + + var _htons = (a0) => (_htons = wasmExports['htons'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['htonl'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['wasm_read'])( + a0, + a1, + a2 + )); + + var _fflush = (a0) => (_fflush = wasmExports['fflush'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['wasm_popen'])( + a0, + a1 + )); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = + wasmExports['wasm_php_exec'])(a0, a1, a2, a3)); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = + wasmExports['php_pollfd_for'])(a0, a1, a2)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = + wasmExports['__wrap_select'])(a0, a1, a2, a3, a4)); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = + wasmExports['wasm_add_cli_arg'])(a0)); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['run_cli'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['wasm_set_sapi_name'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['wasm_set_phpini_path'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['wasm_add_SERVER_entry'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['wasm_add_ENV_entry'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['wasm_set_query_string'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['wasm_set_path_translated'])(a0)); -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["wasm_set_content_type"])(a0); + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['wasm_set_skip_shebang'])(a0)); -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["wasm_set_request_body"])(a0); + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['wasm_set_request_uri'])(a0)); -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["wasm_set_content_length"])(a0); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['wasm_set_request_method'])(a0)); -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["wasm_set_cookies"])(a0); + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['wasm_set_request_host'])(a0)); -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["wasm_set_request_port"])(a0); + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['wasm_set_content_type'])(a0)); -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["wasm_sapi_request_shutdown"])(); + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['wasm_set_request_body'])(a0)); -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["wasm_sapi_handle_request"])(); + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['wasm_set_content_length'])(a0)); -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["php_wasm_init"])(); + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = + wasmExports['wasm_set_cookies'])(a0)); -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["wasm_free"])(a0); + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['wasm_set_request_port'])(a0)); -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["__funcs_on_exit"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["emscripten_builtin_memalign"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["_emscripten_timeout"])(a0, a1); - -var ___trap = () => (___trap = wasmExports["__trap"])(); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["_emscripten_tempret_set"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"])(); - -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["dynCall_vi"])(a0, a1); - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['wasm_sapi_request_shutdown'])()); + + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['wasm_sapi_handle_request'])()); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = + wasmExports['php_wasm_init'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['wasm_free'])(a0)); + + var ___funcs_on_exit = () => + (___funcs_on_exit = wasmExports['__funcs_on_exit'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = + wasmExports['emscripten_builtin_memalign'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['_emscripten_timeout'])(a0, a1); + + var ___trap = () => (___trap = wasmExports['__trap'])(); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['_emscripten_tempret_set'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['_emscripten_stack_restore'])( + a0 + ); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = + wasmExports['emscripten_stack_get_current'])(); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['dynCall_vi'])( + a0, + a1 + )); + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/jspi/php_7_2.js b/packages/php-wasm/node/jspi/php_7_2.js index 6a1d071216..7ee48c5f68 100644 --- a/packages/php-wasm/node/jspi/php_7_2.js +++ b/packages/php-wasm/node/jspi/php_7_2.js @@ -1,6618 +1,7668 @@ -const dependencyFilename = __dirname + '/7_2_34/php_7_2.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 13889651; +const dependencyFilename = __dirname + '/7_2_34/php_7_2.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 13889651; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - if (runtimeInitialized) { - ___trap(); - } - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - Asyncify.instrumentWasmImports(wasmImports); - return { - "env": wasmImports, - "wasi_snapshot_preview1": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["memory"]; - updateMemoryViews(); - addOnInit(wasmExports["__wasm_call_ctors"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); - }); -} - -__asyncjs__js_popen_to_file.sig = "iiii"; - -function __asyncjs__wasm_poll_socket(socketd, events, timeout) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); - }); -} - -__asyncjs__wasm_poll_socket.sig = "iiii"; - -function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); - }); -} - -__asyncjs__js_fd_read.sig = "iiiii"; - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -__asyncjs__js_module_onMessage.sig = "iii"; - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - if (typeof data === "number") { - data = new Uint8Array([ data ]); - } - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + if (runtimeInitialized) { + ___trap(); + } + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + Asyncify.instrumentWasmImports(wasmImports); + return { + env: wasmImports, + wasi_snapshot_preview1: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['memory']; + updateMemoryViews(); + addOnInit(wasmExports['__wasm_call_ctors']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce( + (acc, curr) => acc + curr.length, + 0 + ) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + }); + } + + __asyncjs__js_popen_to_file.sig = 'iiii'; + + function __asyncjs__wasm_poll_socket(socketd, events, timeout) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => + polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + }); + } + + __asyncjs__wasm_poll_socket.sig = 'iiii'; + + function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + }); + } + + __asyncjs__js_fd_read.sig = 'iiiii'; + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + __asyncjs__js_module_onMessage.sig = 'iii'; + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + if (typeof data === 'number') { + data = new Uint8Array([data]); + } + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6623,485 +7673,599 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - if (isAsyncifyImport) { - imports[x] = original = new WebAssembly.Suspending(original); - } - } - } - }, - instrumentWasmExports(exports) { - var exportPattern = /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; - Asyncify.asyncExports = new Set; - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - let isAsyncifyExport = exportPattern.test(x); - if (isAsyncifyExport) { - Asyncify.asyncExports.add(original); - original = Asyncify.makeAsyncFunction(original); - } - ret[x] = (...args) => original(...args); - } else { - ret[x] = original; - } - } - return ret; - }, - asyncExports: null, - isAsyncExport(func) { - return Asyncify.asyncExports?.has(func); - }, - handleAsync: async startAsync => { - runtimeKeepalivePush(); - try { - return await startAsync(); - } finally { - runtimeKeepalivePop(); - } - }, - handleSleep(startAsync) { - return Asyncify.handleAsync(() => new Promise(startAsync)); - }, - makeAsyncFunction(original) { - return WebAssembly.promising(original); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -var stackSave = () => _emscripten_stack_get_current(); - -var stackRestore = val => __emscripten_stack_restore(val); - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func(...cArgs); - function onDone(ret) { - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - if (asyncMode) return ret.then(onDone); - ret = onDone(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ __assert_fail: ___assert_fail, - /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, - /** @export */ __asyncjs__js_module_onMessage: __asyncjs__js_module_onMessage, - /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, - /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, - /** @export */ __call_sighandler: ___call_sighandler, - /** @export */ __syscall_accept4: ___syscall_accept4, - /** @export */ __syscall_bind: ___syscall_bind, - /** @export */ __syscall_chdir: ___syscall_chdir, - /** @export */ __syscall_chmod: ___syscall_chmod, - /** @export */ __syscall_connect: ___syscall_connect, - /** @export */ __syscall_dup: ___syscall_dup, - /** @export */ __syscall_dup3: ___syscall_dup3, - /** @export */ __syscall_faccessat: ___syscall_faccessat, - /** @export */ __syscall_fchmod: ___syscall_fchmod, - /** @export */ __syscall_fchown32: ___syscall_fchown32, - /** @export */ __syscall_fchownat: ___syscall_fchownat, - /** @export */ __syscall_fcntl64: ___syscall_fcntl64, - /** @export */ __syscall_fstat64: ___syscall_fstat64, - /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, - /** @export */ __syscall_getcwd: ___syscall_getcwd, - /** @export */ __syscall_getdents64: ___syscall_getdents64, - /** @export */ __syscall_getpeername: ___syscall_getpeername, - /** @export */ __syscall_getsockname: ___syscall_getsockname, - /** @export */ __syscall_getsockopt: ___syscall_getsockopt, - /** @export */ __syscall_ioctl: ___syscall_ioctl, - /** @export */ __syscall_listen: ___syscall_listen, - /** @export */ __syscall_lstat64: ___syscall_lstat64, - /** @export */ __syscall_mkdirat: ___syscall_mkdirat, - /** @export */ __syscall_newfstatat: ___syscall_newfstatat, - /** @export */ __syscall_openat: ___syscall_openat, - /** @export */ __syscall_pipe: ___syscall_pipe, - /** @export */ __syscall_poll: ___syscall_poll, - /** @export */ __syscall_readlinkat: ___syscall_readlinkat, - /** @export */ __syscall_recvfrom: ___syscall_recvfrom, - /** @export */ __syscall_renameat: ___syscall_renameat, - /** @export */ __syscall_rmdir: ___syscall_rmdir, - /** @export */ __syscall_sendto: ___syscall_sendto, - /** @export */ __syscall_socket: ___syscall_socket, - /** @export */ __syscall_stat64: ___syscall_stat64, - /** @export */ __syscall_statfs64: ___syscall_statfs64, - /** @export */ __syscall_symlink: ___syscall_symlink, - /** @export */ __syscall_unlinkat: ___syscall_unlinkat, - /** @export */ __syscall_utimensat: ___syscall_utimensat, - /** @export */ _abort_js: __abort_js, - /** @export */ _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic, - /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, - /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, - /** @export */ _emscripten_runtime_keepalive_clear: __emscripten_runtime_keepalive_clear, - /** @export */ _gmtime_js: __gmtime_js, - /** @export */ _localtime_js: __localtime_js, - /** @export */ _mktime_js: __mktime_js, - /** @export */ _mmap_js: __mmap_js, - /** @export */ _munmap_js: __munmap_js, - /** @export */ _setitimer_js: __setitimer_js, - /** @export */ _tzset_js: __tzset_js, - /** @export */ emscripten_date_now: _emscripten_date_now, - /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, - /** @export */ emscripten_get_now: _emscripten_get_now, - /** @export */ emscripten_resize_heap: _emscripten_resize_heap, - /** @export */ emscripten_sleep: _emscripten_sleep, - /** @export */ environ_get: _environ_get, - /** @export */ environ_sizes_get: _environ_sizes_get, - /** @export */ exit: _exit, - /** @export */ fd_close: _fd_close, - /** @export */ fd_fdstat_get: _fd_fdstat_get, - /** @export */ fd_read: _fd_read, - /** @export */ fd_seek: _fd_seek, - /** @export */ fd_sync: _fd_sync, - /** @export */ fd_write: _fd_write, - /** @export */ getaddrinfo: _getaddrinfo, - /** @export */ getnameinfo: _getnameinfo, - /** @export */ getprotobyname: _getprotobyname, - /** @export */ getprotobynumber: _getprotobynumber, - /** @export */ js_create_input_device: _js_create_input_device, - /** @export */ js_open_process: _js_open_process, - /** @export */ js_process_status: _js_process_status, - /** @export */ js_waitpid: _js_waitpid, - /** @export */ proc_exit: _proc_exit, - /** @export */ strftime: _strftime, - /** @export */ strftime_l: _strftime_l, - /** @export */ strptime: _strptime, - /** @export */ wasm_close: _wasm_close, - /** @export */ wasm_setsockopt: _wasm_setsockopt -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["__wasm_call_ctors"])(); - -var _malloc = a0 => (_malloc = wasmExports["malloc"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["wasm_sleep"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["ntohs"])(a0); - -var _htons = a0 => (_htons = wasmExports["htons"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["htonl"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["wasm_read"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["fflush"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["wasm_popen"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["wasm_php_exec"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["php_pollfd_for"])(a0, a1, a2); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["__wrap_select"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["wasm_add_cli_arg"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["run_cli"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["wasm_set_sapi_name"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["wasm_set_phpini_path"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["wasm_add_SERVER_entry"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["wasm_add_ENV_entry"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["wasm_set_query_string"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["wasm_set_path_translated"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["wasm_set_skip_shebang"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["wasm_set_request_uri"])(a0); - -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["wasm_set_request_method"])(a0); - -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["wasm_set_request_host"])(a0); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + if (isAsyncifyImport) { + imports[x] = original = new WebAssembly.Suspending( + original + ); + } + } + } + }, + instrumentWasmExports(exports) { + var exportPattern = + /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; + Asyncify.asyncExports = new Set(); + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + let isAsyncifyExport = exportPattern.test(x); + if (isAsyncifyExport) { + Asyncify.asyncExports.add(original); + original = Asyncify.makeAsyncFunction(original); + } + ret[x] = (...args) => original(...args); + } else { + ret[x] = original; + } + } + return ret; + }, + asyncExports: null, + isAsyncExport(func) { + return Asyncify.asyncExports?.has(func); + }, + handleAsync: async (startAsync) => { + runtimeKeepalivePush(); + try { + return await startAsync(); + } finally { + runtimeKeepalivePop(); + } + }, + handleSleep(startAsync) { + return Asyncify.handleAsync(() => new Promise(startAsync)); + }, + makeAsyncFunction(original) { + return WebAssembly.promising(original); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + var stackSave = () => _emscripten_stack_get_current(); + + var stackRestore = (val) => __emscripten_stack_restore(val); + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func(...cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + if (asyncMode) return ret.then(onDone); + ret = onDone(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ __assert_fail: ___assert_fail, + /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, + /** @export */ __asyncjs__js_module_onMessage: + __asyncjs__js_module_onMessage, + /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, + /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, + /** @export */ __call_sighandler: ___call_sighandler, + /** @export */ __syscall_accept4: ___syscall_accept4, + /** @export */ __syscall_bind: ___syscall_bind, + /** @export */ __syscall_chdir: ___syscall_chdir, + /** @export */ __syscall_chmod: ___syscall_chmod, + /** @export */ __syscall_connect: ___syscall_connect, + /** @export */ __syscall_dup: ___syscall_dup, + /** @export */ __syscall_dup3: ___syscall_dup3, + /** @export */ __syscall_faccessat: ___syscall_faccessat, + /** @export */ __syscall_fchmod: ___syscall_fchmod, + /** @export */ __syscall_fchown32: ___syscall_fchown32, + /** @export */ __syscall_fchownat: ___syscall_fchownat, + /** @export */ __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ __syscall_fstat64: ___syscall_fstat64, + /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, + /** @export */ __syscall_getcwd: ___syscall_getcwd, + /** @export */ __syscall_getdents64: ___syscall_getdents64, + /** @export */ __syscall_getpeername: ___syscall_getpeername, + /** @export */ __syscall_getsockname: ___syscall_getsockname, + /** @export */ __syscall_getsockopt: ___syscall_getsockopt, + /** @export */ __syscall_ioctl: ___syscall_ioctl, + /** @export */ __syscall_listen: ___syscall_listen, + /** @export */ __syscall_lstat64: ___syscall_lstat64, + /** @export */ __syscall_mkdirat: ___syscall_mkdirat, + /** @export */ __syscall_newfstatat: ___syscall_newfstatat, + /** @export */ __syscall_openat: ___syscall_openat, + /** @export */ __syscall_pipe: ___syscall_pipe, + /** @export */ __syscall_poll: ___syscall_poll, + /** @export */ __syscall_readlinkat: ___syscall_readlinkat, + /** @export */ __syscall_recvfrom: ___syscall_recvfrom, + /** @export */ __syscall_renameat: ___syscall_renameat, + /** @export */ __syscall_rmdir: ___syscall_rmdir, + /** @export */ __syscall_sendto: ___syscall_sendto, + /** @export */ __syscall_socket: ___syscall_socket, + /** @export */ __syscall_stat64: ___syscall_stat64, + /** @export */ __syscall_statfs64: ___syscall_statfs64, + /** @export */ __syscall_symlink: ___syscall_symlink, + /** @export */ __syscall_unlinkat: ___syscall_unlinkat, + /** @export */ __syscall_utimensat: ___syscall_utimensat, + /** @export */ _abort_js: __abort_js, + /** @export */ _emscripten_get_now_is_monotonic: + __emscripten_get_now_is_monotonic, + /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, + /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, + /** @export */ _emscripten_runtime_keepalive_clear: + __emscripten_runtime_keepalive_clear, + /** @export */ _gmtime_js: __gmtime_js, + /** @export */ _localtime_js: __localtime_js, + /** @export */ _mktime_js: __mktime_js, + /** @export */ _mmap_js: __mmap_js, + /** @export */ _munmap_js: __munmap_js, + /** @export */ _setitimer_js: __setitimer_js, + /** @export */ _tzset_js: __tzset_js, + /** @export */ emscripten_date_now: _emscripten_date_now, + /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, + /** @export */ emscripten_get_now: _emscripten_get_now, + /** @export */ emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ emscripten_sleep: _emscripten_sleep, + /** @export */ environ_get: _environ_get, + /** @export */ environ_sizes_get: _environ_sizes_get, + /** @export */ exit: _exit, + /** @export */ fd_close: _fd_close, + /** @export */ fd_fdstat_get: _fd_fdstat_get, + /** @export */ fd_read: _fd_read, + /** @export */ fd_seek: _fd_seek, + /** @export */ fd_sync: _fd_sync, + /** @export */ fd_write: _fd_write, + /** @export */ getaddrinfo: _getaddrinfo, + /** @export */ getnameinfo: _getnameinfo, + /** @export */ getprotobyname: _getprotobyname, + /** @export */ getprotobynumber: _getprotobynumber, + /** @export */ js_create_input_device: _js_create_input_device, + /** @export */ js_open_process: _js_open_process, + /** @export */ js_process_status: _js_process_status, + /** @export */ js_waitpid: _js_waitpid, + /** @export */ proc_exit: _proc_exit, + /** @export */ strftime: _strftime, + /** @export */ strftime_l: _strftime_l, + /** @export */ strptime: _strptime, + /** @export */ wasm_close: _wasm_close, + /** @export */ wasm_setsockopt: _wasm_setsockopt, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => + (___wasm_call_ctors = wasmExports['__wasm_call_ctors'])(); + + var _malloc = (a0) => (_malloc = wasmExports['malloc'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['wasm_sleep'])(a0)); + + var _ntohs = (a0) => (_ntohs = wasmExports['ntohs'])(a0); + + var _htons = (a0) => (_htons = wasmExports['htons'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['htonl'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['wasm_read'])( + a0, + a1, + a2 + )); + + var _fflush = (a0) => (_fflush = wasmExports['fflush'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['wasm_popen'])( + a0, + a1 + )); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = + wasmExports['wasm_php_exec'])(a0, a1, a2, a3)); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = + wasmExports['php_pollfd_for'])(a0, a1, a2)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = + wasmExports['__wrap_select'])(a0, a1, a2, a3, a4)); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = + wasmExports['wasm_add_cli_arg'])(a0)); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['run_cli'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['wasm_set_sapi_name'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['wasm_set_phpini_path'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['wasm_add_SERVER_entry'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['wasm_add_ENV_entry'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['wasm_set_query_string'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['wasm_set_path_translated'])(a0)); -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["wasm_set_content_type"])(a0); + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['wasm_set_skip_shebang'])(a0)); -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["wasm_set_request_body"])(a0); + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['wasm_set_request_uri'])(a0)); -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["wasm_set_content_length"])(a0); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['wasm_set_request_method'])(a0)); -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["wasm_set_cookies"])(a0); + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['wasm_set_request_host'])(a0)); -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["wasm_set_request_port"])(a0); + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['wasm_set_content_type'])(a0)); -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["wasm_sapi_request_shutdown"])(); + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['wasm_set_request_body'])(a0)); -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["wasm_sapi_handle_request"])(); + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['wasm_set_content_length'])(a0)); -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["php_wasm_init"])(); + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = + wasmExports['wasm_set_cookies'])(a0)); -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["wasm_free"])(a0); + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['wasm_set_request_port'])(a0)); -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["__funcs_on_exit"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["emscripten_builtin_memalign"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["_emscripten_timeout"])(a0, a1); - -var ___trap = () => (___trap = wasmExports["__trap"])(); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["_emscripten_tempret_set"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"])(); - -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["dynCall_vi"])(a0, a1); - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['wasm_sapi_request_shutdown'])()); + + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['wasm_sapi_handle_request'])()); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = + wasmExports['php_wasm_init'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['wasm_free'])(a0)); + + var ___funcs_on_exit = () => + (___funcs_on_exit = wasmExports['__funcs_on_exit'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = + wasmExports['emscripten_builtin_memalign'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['_emscripten_timeout'])(a0, a1); + + var ___trap = () => (___trap = wasmExports['__trap'])(); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['_emscripten_tempret_set'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['_emscripten_stack_restore'])( + a0 + ); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = + wasmExports['emscripten_stack_get_current'])(); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['dynCall_vi'])( + a0, + a1 + )); + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/jspi/php_7_3.js b/packages/php-wasm/node/jspi/php_7_3.js index ae1740f3e8..a0dce5647e 100644 --- a/packages/php-wasm/node/jspi/php_7_3.js +++ b/packages/php-wasm/node/jspi/php_7_3.js @@ -1,6618 +1,7668 @@ -const dependencyFilename = __dirname + '/7_3_33/php_7_3.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 14019617; +const dependencyFilename = __dirname + '/7_3_33/php_7_3.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 14019617; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - if (runtimeInitialized) { - ___trap(); - } - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - Asyncify.instrumentWasmImports(wasmImports); - return { - "env": wasmImports, - "wasi_snapshot_preview1": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["memory"]; - updateMemoryViews(); - addOnInit(wasmExports["__wasm_call_ctors"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); - }); -} - -__asyncjs__js_popen_to_file.sig = "iiii"; - -function __asyncjs__wasm_poll_socket(socketd, events, timeout) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); - }); -} - -__asyncjs__wasm_poll_socket.sig = "iiii"; - -function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); - }); -} - -__asyncjs__js_fd_read.sig = "iiiii"; - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -__asyncjs__js_module_onMessage.sig = "iii"; - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - if (typeof data === "number") { - data = new Uint8Array([ data ]); - } - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + if (runtimeInitialized) { + ___trap(); + } + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + Asyncify.instrumentWasmImports(wasmImports); + return { + env: wasmImports, + wasi_snapshot_preview1: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['memory']; + updateMemoryViews(); + addOnInit(wasmExports['__wasm_call_ctors']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce( + (acc, curr) => acc + curr.length, + 0 + ) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + }); + } + + __asyncjs__js_popen_to_file.sig = 'iiii'; + + function __asyncjs__wasm_poll_socket(socketd, events, timeout) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => + polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + }); + } + + __asyncjs__wasm_poll_socket.sig = 'iiii'; + + function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + }); + } + + __asyncjs__js_fd_read.sig = 'iiiii'; + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + __asyncjs__js_module_onMessage.sig = 'iii'; + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + if (typeof data === 'number') { + data = new Uint8Array([data]); + } + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6623,485 +7673,599 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - if (isAsyncifyImport) { - imports[x] = original = new WebAssembly.Suspending(original); - } - } - } - }, - instrumentWasmExports(exports) { - var exportPattern = /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; - Asyncify.asyncExports = new Set; - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - let isAsyncifyExport = exportPattern.test(x); - if (isAsyncifyExport) { - Asyncify.asyncExports.add(original); - original = Asyncify.makeAsyncFunction(original); - } - ret[x] = (...args) => original(...args); - } else { - ret[x] = original; - } - } - return ret; - }, - asyncExports: null, - isAsyncExport(func) { - return Asyncify.asyncExports?.has(func); - }, - handleAsync: async startAsync => { - runtimeKeepalivePush(); - try { - return await startAsync(); - } finally { - runtimeKeepalivePop(); - } - }, - handleSleep(startAsync) { - return Asyncify.handleAsync(() => new Promise(startAsync)); - }, - makeAsyncFunction(original) { - return WebAssembly.promising(original); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -var stackSave = () => _emscripten_stack_get_current(); - -var stackRestore = val => __emscripten_stack_restore(val); - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func(...cArgs); - function onDone(ret) { - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - if (asyncMode) return ret.then(onDone); - ret = onDone(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ __assert_fail: ___assert_fail, - /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, - /** @export */ __asyncjs__js_module_onMessage: __asyncjs__js_module_onMessage, - /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, - /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, - /** @export */ __call_sighandler: ___call_sighandler, - /** @export */ __syscall_accept4: ___syscall_accept4, - /** @export */ __syscall_bind: ___syscall_bind, - /** @export */ __syscall_chdir: ___syscall_chdir, - /** @export */ __syscall_chmod: ___syscall_chmod, - /** @export */ __syscall_connect: ___syscall_connect, - /** @export */ __syscall_dup: ___syscall_dup, - /** @export */ __syscall_dup3: ___syscall_dup3, - /** @export */ __syscall_faccessat: ___syscall_faccessat, - /** @export */ __syscall_fchmod: ___syscall_fchmod, - /** @export */ __syscall_fchown32: ___syscall_fchown32, - /** @export */ __syscall_fchownat: ___syscall_fchownat, - /** @export */ __syscall_fcntl64: ___syscall_fcntl64, - /** @export */ __syscall_fstat64: ___syscall_fstat64, - /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, - /** @export */ __syscall_getcwd: ___syscall_getcwd, - /** @export */ __syscall_getdents64: ___syscall_getdents64, - /** @export */ __syscall_getpeername: ___syscall_getpeername, - /** @export */ __syscall_getsockname: ___syscall_getsockname, - /** @export */ __syscall_getsockopt: ___syscall_getsockopt, - /** @export */ __syscall_ioctl: ___syscall_ioctl, - /** @export */ __syscall_listen: ___syscall_listen, - /** @export */ __syscall_lstat64: ___syscall_lstat64, - /** @export */ __syscall_mkdirat: ___syscall_mkdirat, - /** @export */ __syscall_newfstatat: ___syscall_newfstatat, - /** @export */ __syscall_openat: ___syscall_openat, - /** @export */ __syscall_pipe: ___syscall_pipe, - /** @export */ __syscall_poll: ___syscall_poll, - /** @export */ __syscall_readlinkat: ___syscall_readlinkat, - /** @export */ __syscall_recvfrom: ___syscall_recvfrom, - /** @export */ __syscall_renameat: ___syscall_renameat, - /** @export */ __syscall_rmdir: ___syscall_rmdir, - /** @export */ __syscall_sendto: ___syscall_sendto, - /** @export */ __syscall_socket: ___syscall_socket, - /** @export */ __syscall_stat64: ___syscall_stat64, - /** @export */ __syscall_statfs64: ___syscall_statfs64, - /** @export */ __syscall_symlink: ___syscall_symlink, - /** @export */ __syscall_unlinkat: ___syscall_unlinkat, - /** @export */ __syscall_utimensat: ___syscall_utimensat, - /** @export */ _abort_js: __abort_js, - /** @export */ _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic, - /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, - /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, - /** @export */ _emscripten_runtime_keepalive_clear: __emscripten_runtime_keepalive_clear, - /** @export */ _gmtime_js: __gmtime_js, - /** @export */ _localtime_js: __localtime_js, - /** @export */ _mktime_js: __mktime_js, - /** @export */ _mmap_js: __mmap_js, - /** @export */ _munmap_js: __munmap_js, - /** @export */ _setitimer_js: __setitimer_js, - /** @export */ _tzset_js: __tzset_js, - /** @export */ emscripten_date_now: _emscripten_date_now, - /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, - /** @export */ emscripten_get_now: _emscripten_get_now, - /** @export */ emscripten_resize_heap: _emscripten_resize_heap, - /** @export */ emscripten_sleep: _emscripten_sleep, - /** @export */ environ_get: _environ_get, - /** @export */ environ_sizes_get: _environ_sizes_get, - /** @export */ exit: _exit, - /** @export */ fd_close: _fd_close, - /** @export */ fd_fdstat_get: _fd_fdstat_get, - /** @export */ fd_read: _fd_read, - /** @export */ fd_seek: _fd_seek, - /** @export */ fd_sync: _fd_sync, - /** @export */ fd_write: _fd_write, - /** @export */ getaddrinfo: _getaddrinfo, - /** @export */ getnameinfo: _getnameinfo, - /** @export */ getprotobyname: _getprotobyname, - /** @export */ getprotobynumber: _getprotobynumber, - /** @export */ js_create_input_device: _js_create_input_device, - /** @export */ js_open_process: _js_open_process, - /** @export */ js_process_status: _js_process_status, - /** @export */ js_waitpid: _js_waitpid, - /** @export */ proc_exit: _proc_exit, - /** @export */ strftime: _strftime, - /** @export */ strftime_l: _strftime_l, - /** @export */ strptime: _strptime, - /** @export */ wasm_close: _wasm_close, - /** @export */ wasm_setsockopt: _wasm_setsockopt -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["__wasm_call_ctors"])(); - -var _malloc = a0 => (_malloc = wasmExports["malloc"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["wasm_read"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["fflush"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["wasm_popen"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["wasm_php_exec"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["php_pollfd_for"])(a0, a1, a2); - -var _htons = a0 => (_htons = wasmExports["htons"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["ntohs"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["htonl"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["wasm_sleep"])(a0); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["__wrap_select"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["wasm_add_cli_arg"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["run_cli"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["wasm_set_sapi_name"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["wasm_set_phpini_path"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["wasm_add_SERVER_entry"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["wasm_add_ENV_entry"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["wasm_set_query_string"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["wasm_set_path_translated"])(a0); - -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["wasm_set_skip_shebang"])(a0); - -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["wasm_set_request_uri"])(a0); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + if (isAsyncifyImport) { + imports[x] = original = new WebAssembly.Suspending( + original + ); + } + } + } + }, + instrumentWasmExports(exports) { + var exportPattern = + /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; + Asyncify.asyncExports = new Set(); + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + let isAsyncifyExport = exportPattern.test(x); + if (isAsyncifyExport) { + Asyncify.asyncExports.add(original); + original = Asyncify.makeAsyncFunction(original); + } + ret[x] = (...args) => original(...args); + } else { + ret[x] = original; + } + } + return ret; + }, + asyncExports: null, + isAsyncExport(func) { + return Asyncify.asyncExports?.has(func); + }, + handleAsync: async (startAsync) => { + runtimeKeepalivePush(); + try { + return await startAsync(); + } finally { + runtimeKeepalivePop(); + } + }, + handleSleep(startAsync) { + return Asyncify.handleAsync(() => new Promise(startAsync)); + }, + makeAsyncFunction(original) { + return WebAssembly.promising(original); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + var stackSave = () => _emscripten_stack_get_current(); + + var stackRestore = (val) => __emscripten_stack_restore(val); + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func(...cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + if (asyncMode) return ret.then(onDone); + ret = onDone(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ __assert_fail: ___assert_fail, + /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, + /** @export */ __asyncjs__js_module_onMessage: + __asyncjs__js_module_onMessage, + /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, + /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, + /** @export */ __call_sighandler: ___call_sighandler, + /** @export */ __syscall_accept4: ___syscall_accept4, + /** @export */ __syscall_bind: ___syscall_bind, + /** @export */ __syscall_chdir: ___syscall_chdir, + /** @export */ __syscall_chmod: ___syscall_chmod, + /** @export */ __syscall_connect: ___syscall_connect, + /** @export */ __syscall_dup: ___syscall_dup, + /** @export */ __syscall_dup3: ___syscall_dup3, + /** @export */ __syscall_faccessat: ___syscall_faccessat, + /** @export */ __syscall_fchmod: ___syscall_fchmod, + /** @export */ __syscall_fchown32: ___syscall_fchown32, + /** @export */ __syscall_fchownat: ___syscall_fchownat, + /** @export */ __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ __syscall_fstat64: ___syscall_fstat64, + /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, + /** @export */ __syscall_getcwd: ___syscall_getcwd, + /** @export */ __syscall_getdents64: ___syscall_getdents64, + /** @export */ __syscall_getpeername: ___syscall_getpeername, + /** @export */ __syscall_getsockname: ___syscall_getsockname, + /** @export */ __syscall_getsockopt: ___syscall_getsockopt, + /** @export */ __syscall_ioctl: ___syscall_ioctl, + /** @export */ __syscall_listen: ___syscall_listen, + /** @export */ __syscall_lstat64: ___syscall_lstat64, + /** @export */ __syscall_mkdirat: ___syscall_mkdirat, + /** @export */ __syscall_newfstatat: ___syscall_newfstatat, + /** @export */ __syscall_openat: ___syscall_openat, + /** @export */ __syscall_pipe: ___syscall_pipe, + /** @export */ __syscall_poll: ___syscall_poll, + /** @export */ __syscall_readlinkat: ___syscall_readlinkat, + /** @export */ __syscall_recvfrom: ___syscall_recvfrom, + /** @export */ __syscall_renameat: ___syscall_renameat, + /** @export */ __syscall_rmdir: ___syscall_rmdir, + /** @export */ __syscall_sendto: ___syscall_sendto, + /** @export */ __syscall_socket: ___syscall_socket, + /** @export */ __syscall_stat64: ___syscall_stat64, + /** @export */ __syscall_statfs64: ___syscall_statfs64, + /** @export */ __syscall_symlink: ___syscall_symlink, + /** @export */ __syscall_unlinkat: ___syscall_unlinkat, + /** @export */ __syscall_utimensat: ___syscall_utimensat, + /** @export */ _abort_js: __abort_js, + /** @export */ _emscripten_get_now_is_monotonic: + __emscripten_get_now_is_monotonic, + /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, + /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, + /** @export */ _emscripten_runtime_keepalive_clear: + __emscripten_runtime_keepalive_clear, + /** @export */ _gmtime_js: __gmtime_js, + /** @export */ _localtime_js: __localtime_js, + /** @export */ _mktime_js: __mktime_js, + /** @export */ _mmap_js: __mmap_js, + /** @export */ _munmap_js: __munmap_js, + /** @export */ _setitimer_js: __setitimer_js, + /** @export */ _tzset_js: __tzset_js, + /** @export */ emscripten_date_now: _emscripten_date_now, + /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, + /** @export */ emscripten_get_now: _emscripten_get_now, + /** @export */ emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ emscripten_sleep: _emscripten_sleep, + /** @export */ environ_get: _environ_get, + /** @export */ environ_sizes_get: _environ_sizes_get, + /** @export */ exit: _exit, + /** @export */ fd_close: _fd_close, + /** @export */ fd_fdstat_get: _fd_fdstat_get, + /** @export */ fd_read: _fd_read, + /** @export */ fd_seek: _fd_seek, + /** @export */ fd_sync: _fd_sync, + /** @export */ fd_write: _fd_write, + /** @export */ getaddrinfo: _getaddrinfo, + /** @export */ getnameinfo: _getnameinfo, + /** @export */ getprotobyname: _getprotobyname, + /** @export */ getprotobynumber: _getprotobynumber, + /** @export */ js_create_input_device: _js_create_input_device, + /** @export */ js_open_process: _js_open_process, + /** @export */ js_process_status: _js_process_status, + /** @export */ js_waitpid: _js_waitpid, + /** @export */ proc_exit: _proc_exit, + /** @export */ strftime: _strftime, + /** @export */ strftime_l: _strftime_l, + /** @export */ strptime: _strptime, + /** @export */ wasm_close: _wasm_close, + /** @export */ wasm_setsockopt: _wasm_setsockopt, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => + (___wasm_call_ctors = wasmExports['__wasm_call_ctors'])(); + + var _malloc = (a0) => (_malloc = wasmExports['malloc'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['wasm_read'])( + a0, + a1, + a2 + )); + + var _fflush = (a0) => (_fflush = wasmExports['fflush'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['wasm_popen'])( + a0, + a1 + )); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = + wasmExports['wasm_php_exec'])(a0, a1, a2, a3)); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = + wasmExports['php_pollfd_for'])(a0, a1, a2)); + + var _htons = (a0) => (_htons = wasmExports['htons'])(a0); + + var _ntohs = (a0) => (_ntohs = wasmExports['ntohs'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['htonl'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['wasm_sleep'])(a0)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = + wasmExports['__wrap_select'])(a0, a1, a2, a3, a4)); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = + wasmExports['wasm_add_cli_arg'])(a0)); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['run_cli'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['wasm_set_sapi_name'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['wasm_set_phpini_path'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['wasm_add_SERVER_entry'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['wasm_add_ENV_entry'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['wasm_set_query_string'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['wasm_set_path_translated'])(a0)); -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["wasm_set_request_method"])(a0); + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['wasm_set_skip_shebang'])(a0)); -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["wasm_set_request_host"])(a0); + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['wasm_set_request_uri'])(a0)); -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["wasm_set_content_type"])(a0); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['wasm_set_request_method'])(a0)); -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["wasm_set_request_body"])(a0); + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['wasm_set_request_host'])(a0)); -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["wasm_set_content_length"])(a0); + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['wasm_set_content_type'])(a0)); -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["wasm_set_cookies"])(a0); + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['wasm_set_request_body'])(a0)); -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["wasm_set_request_port"])(a0); + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['wasm_set_content_length'])(a0)); -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["wasm_sapi_request_shutdown"])(); + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = + wasmExports['wasm_set_cookies'])(a0)); -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["wasm_sapi_handle_request"])(); + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['wasm_set_request_port'])(a0)); -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["php_wasm_init"])(); + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['wasm_sapi_request_shutdown'])()); -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["wasm_free"])(a0); + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['wasm_sapi_handle_request'])()); -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["__funcs_on_exit"])(); + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = + wasmExports['php_wasm_init'])()); -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["emscripten_builtin_memalign"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["_emscripten_timeout"])(a0, a1); - -var ___trap = () => (___trap = wasmExports["__trap"])(); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["_emscripten_tempret_set"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"])(); - -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["dynCall_vi"])(a0, a1); - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['wasm_free'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var ___funcs_on_exit = () => + (___funcs_on_exit = wasmExports['__funcs_on_exit'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = + wasmExports['emscripten_builtin_memalign'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['_emscripten_timeout'])(a0, a1); + + var ___trap = () => (___trap = wasmExports['__trap'])(); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['_emscripten_tempret_set'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['_emscripten_stack_restore'])( + a0 + ); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = + wasmExports['emscripten_stack_get_current'])(); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['dynCall_vi'])( + a0, + a1 + )); + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/jspi/php_7_4.js b/packages/php-wasm/node/jspi/php_7_4.js index 61642c812c..3bdc81f189 100644 --- a/packages/php-wasm/node/jspi/php_7_4.js +++ b/packages/php-wasm/node/jspi/php_7_4.js @@ -1,6635 +1,7692 @@ -const dependencyFilename = __dirname + '/7_4_33/php_7_4.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 14693201; +const dependencyFilename = __dirname + '/7_4_33/php_7_4.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 14693201; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - if (runtimeInitialized) { - ___trap(); - } - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - Asyncify.instrumentWasmImports(wasmImports); - return { - "env": wasmImports, - "wasi_snapshot_preview1": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["memory"]; - updateMemoryViews(); - addOnInit(wasmExports["__wasm_call_ctors"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); - }); -} - -__asyncjs__js_popen_to_file.sig = "iiii"; - -function __asyncjs__wasm_poll_socket(socketd, events, timeout) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); - }); -} - -__asyncjs__wasm_poll_socket.sig = "iiii"; - -function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); - }); -} - -__asyncjs__js_fd_read.sig = "iiiii"; - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -__asyncjs__js_module_onMessage.sig = "iii"; - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -/** @type {function(...*):?} */ function _SharpYuvConvert() { - abort("missing function: SharpYuvConvert"); -} - -_SharpYuvConvert.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { - abort("missing function: SharpYuvGetConversionMatrix"); -} - -_SharpYuvGetConversionMatrix.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvInit() { - abort("missing function: SharpYuvInit"); -} - -_SharpYuvInit.stub = true; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var ___call_sighandler = (fp, sig) => (a1 => dynCall_vi(fp, a1))(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_fallocate(fd, mode, offset_low, offset_high, len_low, len_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - var len = convertI32PairToI53Checked(len_low, len_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.allocate(stream, offset, len); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fdatasync(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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; - } -} - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - if (typeof data === "number") { - data = new Uint8Array([ data ]); - } - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + if (runtimeInitialized) { + ___trap(); + } + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + Asyncify.instrumentWasmImports(wasmImports); + return { + env: wasmImports, + wasi_snapshot_preview1: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['memory']; + updateMemoryViews(); + addOnInit(wasmExports['__wasm_call_ctors']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce( + (acc, curr) => acc + curr.length, + 0 + ) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + }); + } + + __asyncjs__js_popen_to_file.sig = 'iiii'; + + function __asyncjs__wasm_poll_socket(socketd, events, timeout) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => + polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + }); + } + + __asyncjs__wasm_poll_socket.sig = 'iiii'; + + function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + }); + } + + __asyncjs__js_fd_read.sig = 'iiiii'; + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + __asyncjs__js_module_onMessage.sig = 'iii'; + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + /** @type {function(...*):?} */ function _SharpYuvConvert() { + abort('missing function: SharpYuvConvert'); + } + + _SharpYuvConvert.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { + abort('missing function: SharpYuvGetConversionMatrix'); + } + + _SharpYuvGetConversionMatrix.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvInit() { + abort('missing function: SharpYuvInit'); + } + + _SharpYuvInit.stub = true; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var ___call_sighandler = (fp, sig) => ((a1) => dynCall_vi(fp, a1))(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_fallocate( + fd, + mode, + offset_low, + offset_high, + len_low, + len_high + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + var len = convertI32PairToI53Checked(len_low, len_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.allocate(stream, offset, len); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fdatasync(fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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; + } + } + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + if (typeof data === 'number') { + data = new Uint8Array([data]); + } + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6640,494 +7697,609 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -function _wasm_shutdown(socketd, how) { - return PHPWASM.shutdownSocket(socketd, how); -} - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - if (isAsyncifyImport) { - imports[x] = original = new WebAssembly.Suspending(original); - } - } - } - }, - instrumentWasmExports(exports) { - var exportPattern = /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; - Asyncify.asyncExports = new Set; - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - let isAsyncifyExport = exportPattern.test(x); - if (isAsyncifyExport) { - Asyncify.asyncExports.add(original); - original = Asyncify.makeAsyncFunction(original); - } - ret[x] = (...args) => original(...args); - } else { - ret[x] = original; - } - } - return ret; - }, - asyncExports: null, - isAsyncExport(func) { - return Asyncify.asyncExports?.has(func); - }, - handleAsync: async startAsync => { - runtimeKeepalivePush(); - try { - return await startAsync(); - } finally { - runtimeKeepalivePop(); - } - }, - handleSleep(startAsync) { - return Asyncify.handleAsync(() => new Promise(startAsync)); - }, - makeAsyncFunction(original) { - return WebAssembly.promising(original); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -var stackSave = () => _emscripten_stack_get_current(); - -var stackRestore = val => __emscripten_stack_restore(val); - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func(...cArgs); - function onDone(ret) { - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - if (asyncMode) return ret.then(onDone); - ret = onDone(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ SharpYuvConvert: _SharpYuvConvert, - /** @export */ SharpYuvGetConversionMatrix: _SharpYuvGetConversionMatrix, - /** @export */ SharpYuvInit: _SharpYuvInit, - /** @export */ __assert_fail: ___assert_fail, - /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, - /** @export */ __asyncjs__js_module_onMessage: __asyncjs__js_module_onMessage, - /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, - /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, - /** @export */ __call_sighandler: ___call_sighandler, - /** @export */ __syscall_accept4: ___syscall_accept4, - /** @export */ __syscall_bind: ___syscall_bind, - /** @export */ __syscall_chdir: ___syscall_chdir, - /** @export */ __syscall_chmod: ___syscall_chmod, - /** @export */ __syscall_connect: ___syscall_connect, - /** @export */ __syscall_dup: ___syscall_dup, - /** @export */ __syscall_dup3: ___syscall_dup3, - /** @export */ __syscall_faccessat: ___syscall_faccessat, - /** @export */ __syscall_fallocate: ___syscall_fallocate, - /** @export */ __syscall_fchmod: ___syscall_fchmod, - /** @export */ __syscall_fchown32: ___syscall_fchown32, - /** @export */ __syscall_fchownat: ___syscall_fchownat, - /** @export */ __syscall_fcntl64: ___syscall_fcntl64, - /** @export */ __syscall_fdatasync: ___syscall_fdatasync, - /** @export */ __syscall_fstat64: ___syscall_fstat64, - /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, - /** @export */ __syscall_getcwd: ___syscall_getcwd, - /** @export */ __syscall_getdents64: ___syscall_getdents64, - /** @export */ __syscall_getpeername: ___syscall_getpeername, - /** @export */ __syscall_getsockname: ___syscall_getsockname, - /** @export */ __syscall_getsockopt: ___syscall_getsockopt, - /** @export */ __syscall_ioctl: ___syscall_ioctl, - /** @export */ __syscall_listen: ___syscall_listen, - /** @export */ __syscall_lstat64: ___syscall_lstat64, - /** @export */ __syscall_mkdirat: ___syscall_mkdirat, - /** @export */ __syscall_newfstatat: ___syscall_newfstatat, - /** @export */ __syscall_openat: ___syscall_openat, - /** @export */ __syscall_pipe: ___syscall_pipe, - /** @export */ __syscall_poll: ___syscall_poll, - /** @export */ __syscall_readlinkat: ___syscall_readlinkat, - /** @export */ __syscall_recvfrom: ___syscall_recvfrom, - /** @export */ __syscall_renameat: ___syscall_renameat, - /** @export */ __syscall_rmdir: ___syscall_rmdir, - /** @export */ __syscall_sendto: ___syscall_sendto, - /** @export */ __syscall_socket: ___syscall_socket, - /** @export */ __syscall_stat64: ___syscall_stat64, - /** @export */ __syscall_statfs64: ___syscall_statfs64, - /** @export */ __syscall_symlink: ___syscall_symlink, - /** @export */ __syscall_unlinkat: ___syscall_unlinkat, - /** @export */ __syscall_utimensat: ___syscall_utimensat, - /** @export */ _abort_js: __abort_js, - /** @export */ _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic, - /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, - /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, - /** @export */ _emscripten_runtime_keepalive_clear: __emscripten_runtime_keepalive_clear, - /** @export */ _gmtime_js: __gmtime_js, - /** @export */ _localtime_js: __localtime_js, - /** @export */ _mktime_js: __mktime_js, - /** @export */ _mmap_js: __mmap_js, - /** @export */ _munmap_js: __munmap_js, - /** @export */ _setitimer_js: __setitimer_js, - /** @export */ _tzset_js: __tzset_js, - /** @export */ emscripten_date_now: _emscripten_date_now, - /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, - /** @export */ emscripten_get_now: _emscripten_get_now, - /** @export */ emscripten_resize_heap: _emscripten_resize_heap, - /** @export */ emscripten_sleep: _emscripten_sleep, - /** @export */ environ_get: _environ_get, - /** @export */ environ_sizes_get: _environ_sizes_get, - /** @export */ exit: _exit, - /** @export */ fd_close: _fd_close, - /** @export */ fd_fdstat_get: _fd_fdstat_get, - /** @export */ fd_read: _fd_read, - /** @export */ fd_seek: _fd_seek, - /** @export */ fd_write: _fd_write, - /** @export */ getaddrinfo: _getaddrinfo, - /** @export */ getnameinfo: _getnameinfo, - /** @export */ getprotobyname: _getprotobyname, - /** @export */ getprotobynumber: _getprotobynumber, - /** @export */ js_create_input_device: _js_create_input_device, - /** @export */ js_open_process: _js_open_process, - /** @export */ js_process_status: _js_process_status, - /** @export */ js_waitpid: _js_waitpid, - /** @export */ proc_exit: _proc_exit, - /** @export */ strftime: _strftime, - /** @export */ strftime_l: _strftime_l, - /** @export */ strptime: _strptime, - /** @export */ wasm_close: _wasm_close, - /** @export */ wasm_setsockopt: _wasm_setsockopt, - /** @export */ wasm_shutdown: _wasm_shutdown -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["__wasm_call_ctors"])(); - -var _malloc = a0 => (_malloc = wasmExports["malloc"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["wasm_read"])(a0, a1, a2); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["php_pollfd_for"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["fflush"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["wasm_popen"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["wasm_php_exec"])(a0, a1, a2, a3); - -var _htons = a0 => (_htons = wasmExports["htons"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["ntohs"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["htonl"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["wasm_sleep"])(a0); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["__wrap_select"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["wasm_add_cli_arg"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["run_cli"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["wasm_set_sapi_name"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["wasm_set_phpini_path"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["wasm_add_SERVER_entry"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["wasm_add_ENV_entry"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["wasm_set_query_string"])(a0); - -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["wasm_set_path_translated"])(a0); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + function _wasm_shutdown(socketd, how) { + return PHPWASM.shutdownSocket(socketd, how); + } + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + if (isAsyncifyImport) { + imports[x] = original = new WebAssembly.Suspending( + original + ); + } + } + } + }, + instrumentWasmExports(exports) { + var exportPattern = + /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; + Asyncify.asyncExports = new Set(); + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + let isAsyncifyExport = exportPattern.test(x); + if (isAsyncifyExport) { + Asyncify.asyncExports.add(original); + original = Asyncify.makeAsyncFunction(original); + } + ret[x] = (...args) => original(...args); + } else { + ret[x] = original; + } + } + return ret; + }, + asyncExports: null, + isAsyncExport(func) { + return Asyncify.asyncExports?.has(func); + }, + handleAsync: async (startAsync) => { + runtimeKeepalivePush(); + try { + return await startAsync(); + } finally { + runtimeKeepalivePop(); + } + }, + handleSleep(startAsync) { + return Asyncify.handleAsync(() => new Promise(startAsync)); + }, + makeAsyncFunction(original) { + return WebAssembly.promising(original); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + var stackSave = () => _emscripten_stack_get_current(); + + var stackRestore = (val) => __emscripten_stack_restore(val); + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func(...cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + if (asyncMode) return ret.then(onDone); + ret = onDone(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ SharpYuvConvert: _SharpYuvConvert, + /** @export */ SharpYuvGetConversionMatrix: + _SharpYuvGetConversionMatrix, + /** @export */ SharpYuvInit: _SharpYuvInit, + /** @export */ __assert_fail: ___assert_fail, + /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, + /** @export */ __asyncjs__js_module_onMessage: + __asyncjs__js_module_onMessage, + /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, + /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, + /** @export */ __call_sighandler: ___call_sighandler, + /** @export */ __syscall_accept4: ___syscall_accept4, + /** @export */ __syscall_bind: ___syscall_bind, + /** @export */ __syscall_chdir: ___syscall_chdir, + /** @export */ __syscall_chmod: ___syscall_chmod, + /** @export */ __syscall_connect: ___syscall_connect, + /** @export */ __syscall_dup: ___syscall_dup, + /** @export */ __syscall_dup3: ___syscall_dup3, + /** @export */ __syscall_faccessat: ___syscall_faccessat, + /** @export */ __syscall_fallocate: ___syscall_fallocate, + /** @export */ __syscall_fchmod: ___syscall_fchmod, + /** @export */ __syscall_fchown32: ___syscall_fchown32, + /** @export */ __syscall_fchownat: ___syscall_fchownat, + /** @export */ __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ __syscall_fdatasync: ___syscall_fdatasync, + /** @export */ __syscall_fstat64: ___syscall_fstat64, + /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, + /** @export */ __syscall_getcwd: ___syscall_getcwd, + /** @export */ __syscall_getdents64: ___syscall_getdents64, + /** @export */ __syscall_getpeername: ___syscall_getpeername, + /** @export */ __syscall_getsockname: ___syscall_getsockname, + /** @export */ __syscall_getsockopt: ___syscall_getsockopt, + /** @export */ __syscall_ioctl: ___syscall_ioctl, + /** @export */ __syscall_listen: ___syscall_listen, + /** @export */ __syscall_lstat64: ___syscall_lstat64, + /** @export */ __syscall_mkdirat: ___syscall_mkdirat, + /** @export */ __syscall_newfstatat: ___syscall_newfstatat, + /** @export */ __syscall_openat: ___syscall_openat, + /** @export */ __syscall_pipe: ___syscall_pipe, + /** @export */ __syscall_poll: ___syscall_poll, + /** @export */ __syscall_readlinkat: ___syscall_readlinkat, + /** @export */ __syscall_recvfrom: ___syscall_recvfrom, + /** @export */ __syscall_renameat: ___syscall_renameat, + /** @export */ __syscall_rmdir: ___syscall_rmdir, + /** @export */ __syscall_sendto: ___syscall_sendto, + /** @export */ __syscall_socket: ___syscall_socket, + /** @export */ __syscall_stat64: ___syscall_stat64, + /** @export */ __syscall_statfs64: ___syscall_statfs64, + /** @export */ __syscall_symlink: ___syscall_symlink, + /** @export */ __syscall_unlinkat: ___syscall_unlinkat, + /** @export */ __syscall_utimensat: ___syscall_utimensat, + /** @export */ _abort_js: __abort_js, + /** @export */ _emscripten_get_now_is_monotonic: + __emscripten_get_now_is_monotonic, + /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, + /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, + /** @export */ _emscripten_runtime_keepalive_clear: + __emscripten_runtime_keepalive_clear, + /** @export */ _gmtime_js: __gmtime_js, + /** @export */ _localtime_js: __localtime_js, + /** @export */ _mktime_js: __mktime_js, + /** @export */ _mmap_js: __mmap_js, + /** @export */ _munmap_js: __munmap_js, + /** @export */ _setitimer_js: __setitimer_js, + /** @export */ _tzset_js: __tzset_js, + /** @export */ emscripten_date_now: _emscripten_date_now, + /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, + /** @export */ emscripten_get_now: _emscripten_get_now, + /** @export */ emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ emscripten_sleep: _emscripten_sleep, + /** @export */ environ_get: _environ_get, + /** @export */ environ_sizes_get: _environ_sizes_get, + /** @export */ exit: _exit, + /** @export */ fd_close: _fd_close, + /** @export */ fd_fdstat_get: _fd_fdstat_get, + /** @export */ fd_read: _fd_read, + /** @export */ fd_seek: _fd_seek, + /** @export */ fd_write: _fd_write, + /** @export */ getaddrinfo: _getaddrinfo, + /** @export */ getnameinfo: _getnameinfo, + /** @export */ getprotobyname: _getprotobyname, + /** @export */ getprotobynumber: _getprotobynumber, + /** @export */ js_create_input_device: _js_create_input_device, + /** @export */ js_open_process: _js_open_process, + /** @export */ js_process_status: _js_process_status, + /** @export */ js_waitpid: _js_waitpid, + /** @export */ proc_exit: _proc_exit, + /** @export */ strftime: _strftime, + /** @export */ strftime_l: _strftime_l, + /** @export */ strptime: _strptime, + /** @export */ wasm_close: _wasm_close, + /** @export */ wasm_setsockopt: _wasm_setsockopt, + /** @export */ wasm_shutdown: _wasm_shutdown, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => + (___wasm_call_ctors = wasmExports['__wasm_call_ctors'])(); + + var _malloc = (a0) => (_malloc = wasmExports['malloc'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['wasm_read'])( + a0, + a1, + a2 + )); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = + wasmExports['php_pollfd_for'])(a0, a1, a2)); + + var _fflush = (a0) => (_fflush = wasmExports['fflush'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['wasm_popen'])( + a0, + a1 + )); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = + wasmExports['wasm_php_exec'])(a0, a1, a2, a3)); + + var _htons = (a0) => (_htons = wasmExports['htons'])(a0); + + var _ntohs = (a0) => (_ntohs = wasmExports['ntohs'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['htonl'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['wasm_sleep'])(a0)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = + wasmExports['__wrap_select'])(a0, a1, a2, a3, a4)); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = + wasmExports['wasm_add_cli_arg'])(a0)); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['run_cli'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['wasm_set_sapi_name'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['wasm_set_phpini_path'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['wasm_add_SERVER_entry'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['wasm_add_ENV_entry'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['wasm_set_query_string'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['wasm_set_path_translated'])(a0)); -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["wasm_set_skip_shebang"])(a0); + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['wasm_set_skip_shebang'])(a0)); -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["wasm_set_request_uri"])(a0); + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['wasm_set_request_uri'])(a0)); -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["wasm_set_request_method"])(a0); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['wasm_set_request_method'])(a0)); -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["wasm_set_request_host"])(a0); + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['wasm_set_request_host'])(a0)); -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["wasm_set_content_type"])(a0); + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['wasm_set_content_type'])(a0)); -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["wasm_set_request_body"])(a0); + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['wasm_set_request_body'])(a0)); -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["wasm_set_content_length"])(a0); + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['wasm_set_content_length'])(a0)); -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["wasm_set_cookies"])(a0); + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = + wasmExports['wasm_set_cookies'])(a0)); -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["wasm_set_request_port"])(a0); + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['wasm_set_request_port'])(a0)); -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["wasm_sapi_request_shutdown"])(); + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['wasm_sapi_request_shutdown'])()); -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["wasm_sapi_handle_request"])(); + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['wasm_sapi_handle_request'])()); -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["php_wasm_init"])(); + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = + wasmExports['php_wasm_init'])()); -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["wasm_free"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["__funcs_on_exit"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["emscripten_builtin_memalign"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["_emscripten_timeout"])(a0, a1); - -var ___trap = () => (___trap = wasmExports["__trap"])(); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["_emscripten_tempret_set"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"])(); - -var dynCall_vi = Module["dynCall_vi"] = (a0, a1) => (dynCall_vi = Module["dynCall_vi"] = wasmExports["dynCall_vi"])(a0, a1); - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['wasm_free'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var ___funcs_on_exit = () => + (___funcs_on_exit = wasmExports['__funcs_on_exit'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = + wasmExports['emscripten_builtin_memalign'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['_emscripten_timeout'])(a0, a1); + + var ___trap = () => (___trap = wasmExports['__trap'])(); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['_emscripten_tempret_set'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['_emscripten_stack_restore'])( + a0 + ); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = + wasmExports['emscripten_stack_get_current'])(); + + var dynCall_vi = (Module['dynCall_vi'] = (a0, a1) => + (dynCall_vi = Module['dynCall_vi'] = wasmExports['dynCall_vi'])( + a0, + a1 + )); + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/jspi/php_8_0.js b/packages/php-wasm/node/jspi/php_8_0.js index 9089f18a25..7a102fbd5b 100644 --- a/packages/php-wasm/node/jspi/php_8_0.js +++ b/packages/php-wasm/node/jspi/php_8_0.js @@ -1,6652 +1,7711 @@ -const dependencyFilename = __dirname + '/8_0_30/php_8_0.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 14262455; +const dependencyFilename = __dirname + '/8_0_30/php_8_0.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 14262455; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - if (runtimeInitialized) { - ___trap(); - } - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - Asyncify.instrumentWasmImports(wasmImports); - return { - "env": wasmImports, - "wasi_snapshot_preview1": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["memory"]; - updateMemoryViews(); - wasmTable = wasmExports["__indirect_function_table"]; - addOnInit(wasmExports["__wasm_call_ctors"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); - }); -} - -__asyncjs__js_popen_to_file.sig = "iiii"; - -function __asyncjs__wasm_poll_socket(socketd, events, timeout) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); - }); -} - -__asyncjs__wasm_poll_socket.sig = "iiii"; - -function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); - }); -} - -__asyncjs__js_fd_read.sig = "iiiii"; - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -__asyncjs__js_module_onMessage.sig = "iii"; - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -/** @type {function(...*):?} */ function _SharpYuvConvert() { - abort("missing function: SharpYuvConvert"); -} - -_SharpYuvConvert.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { - abort("missing function: SharpYuvGetConversionMatrix"); -} - -_SharpYuvGetConversionMatrix.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvInit() { - abort("missing function: SharpYuvInit"); -} - -_SharpYuvInit.stub = true; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var wasmTableMirror = []; - -/** @type {WebAssembly.Table} */ var wasmTable; - -var getWasmTableEntry = funcPtr => { - var func = wasmTableMirror[funcPtr]; - if (!func) { - if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; - wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); - if (Asyncify.isAsyncExport(func)) { - wasmTableMirror[funcPtr] = func = Asyncify.makeAsyncFunction(func); - } - } - return func; -}; - -var ___call_sighandler = (fp, sig) => getWasmTableEntry(fp)(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_fallocate(fd, mode, offset_low, offset_high, len_low, len_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - var len = convertI32PairToI53Checked(len_low, len_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.allocate(stream, offset, len); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fdatasync(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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; - } -} - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - if (typeof data === "number") { - data = new Uint8Array([ data ]); - } - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + if (runtimeInitialized) { + ___trap(); + } + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + Asyncify.instrumentWasmImports(wasmImports); + return { + env: wasmImports, + wasi_snapshot_preview1: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['memory']; + updateMemoryViews(); + wasmTable = wasmExports['__indirect_function_table']; + addOnInit(wasmExports['__wasm_call_ctors']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce( + (acc, curr) => acc + curr.length, + 0 + ) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + }); + } + + __asyncjs__js_popen_to_file.sig = 'iiii'; + + function __asyncjs__wasm_poll_socket(socketd, events, timeout) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => + polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + }); + } + + __asyncjs__wasm_poll_socket.sig = 'iiii'; + + function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + }); + } + + __asyncjs__js_fd_read.sig = 'iiiii'; + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + __asyncjs__js_module_onMessage.sig = 'iii'; + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + /** @type {function(...*):?} */ function _SharpYuvConvert() { + abort('missing function: SharpYuvConvert'); + } + + _SharpYuvConvert.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { + abort('missing function: SharpYuvGetConversionMatrix'); + } + + _SharpYuvGetConversionMatrix.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvInit() { + abort('missing function: SharpYuvInit'); + } + + _SharpYuvInit.stub = true; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var wasmTableMirror = []; + + /** @type {WebAssembly.Table} */ var wasmTable; + + var getWasmTableEntry = (funcPtr) => { + var func = wasmTableMirror[funcPtr]; + if (!func) { + if (funcPtr >= wasmTableMirror.length) + wasmTableMirror.length = funcPtr + 1; + wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); + if (Asyncify.isAsyncExport(func)) { + wasmTableMirror[funcPtr] = func = + Asyncify.makeAsyncFunction(func); + } + } + return func; + }; + + var ___call_sighandler = (fp, sig) => getWasmTableEntry(fp)(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_fallocate( + fd, + mode, + offset_low, + offset_high, + len_low, + len_high + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + var len = convertI32PairToI53Checked(len_low, len_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.allocate(stream, offset, len); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fdatasync(fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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; + } + } + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + if (typeof data === 'number') { + data = new Uint8Array([data]); + } + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6657,492 +7716,603 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -function _wasm_shutdown(socketd, how) { - return PHPWASM.shutdownSocket(socketd, how); -} - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - if (isAsyncifyImport) { - imports[x] = original = new WebAssembly.Suspending(original); - } - } - } - }, - instrumentWasmExports(exports) { - var exportPattern = /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; - Asyncify.asyncExports = new Set; - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - let isAsyncifyExport = exportPattern.test(x); - if (isAsyncifyExport) { - Asyncify.asyncExports.add(original); - original = Asyncify.makeAsyncFunction(original); - } - ret[x] = (...args) => original(...args); - } else { - ret[x] = original; - } - } - return ret; - }, - asyncExports: null, - isAsyncExport(func) { - return Asyncify.asyncExports?.has(func); - }, - handleAsync: async startAsync => { - runtimeKeepalivePush(); - try { - return await startAsync(); - } finally { - runtimeKeepalivePop(); - } - }, - handleSleep(startAsync) { - return Asyncify.handleAsync(() => new Promise(startAsync)); - }, - makeAsyncFunction(original) { - return WebAssembly.promising(original); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -var stackSave = () => _emscripten_stack_get_current(); - -var stackRestore = val => __emscripten_stack_restore(val); - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func(...cArgs); - function onDone(ret) { - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - if (asyncMode) return ret.then(onDone); - ret = onDone(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ SharpYuvConvert: _SharpYuvConvert, - /** @export */ SharpYuvGetConversionMatrix: _SharpYuvGetConversionMatrix, - /** @export */ SharpYuvInit: _SharpYuvInit, - /** @export */ __assert_fail: ___assert_fail, - /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, - /** @export */ __asyncjs__js_module_onMessage: __asyncjs__js_module_onMessage, - /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, - /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, - /** @export */ __call_sighandler: ___call_sighandler, - /** @export */ __syscall_accept4: ___syscall_accept4, - /** @export */ __syscall_bind: ___syscall_bind, - /** @export */ __syscall_chdir: ___syscall_chdir, - /** @export */ __syscall_chmod: ___syscall_chmod, - /** @export */ __syscall_connect: ___syscall_connect, - /** @export */ __syscall_dup: ___syscall_dup, - /** @export */ __syscall_dup3: ___syscall_dup3, - /** @export */ __syscall_faccessat: ___syscall_faccessat, - /** @export */ __syscall_fallocate: ___syscall_fallocate, - /** @export */ __syscall_fchmod: ___syscall_fchmod, - /** @export */ __syscall_fchown32: ___syscall_fchown32, - /** @export */ __syscall_fchownat: ___syscall_fchownat, - /** @export */ __syscall_fcntl64: ___syscall_fcntl64, - /** @export */ __syscall_fdatasync: ___syscall_fdatasync, - /** @export */ __syscall_fstat64: ___syscall_fstat64, - /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, - /** @export */ __syscall_getcwd: ___syscall_getcwd, - /** @export */ __syscall_getdents64: ___syscall_getdents64, - /** @export */ __syscall_getpeername: ___syscall_getpeername, - /** @export */ __syscall_getsockname: ___syscall_getsockname, - /** @export */ __syscall_getsockopt: ___syscall_getsockopt, - /** @export */ __syscall_ioctl: ___syscall_ioctl, - /** @export */ __syscall_listen: ___syscall_listen, - /** @export */ __syscall_lstat64: ___syscall_lstat64, - /** @export */ __syscall_mkdirat: ___syscall_mkdirat, - /** @export */ __syscall_newfstatat: ___syscall_newfstatat, - /** @export */ __syscall_openat: ___syscall_openat, - /** @export */ __syscall_pipe: ___syscall_pipe, - /** @export */ __syscall_poll: ___syscall_poll, - /** @export */ __syscall_readlinkat: ___syscall_readlinkat, - /** @export */ __syscall_recvfrom: ___syscall_recvfrom, - /** @export */ __syscall_renameat: ___syscall_renameat, - /** @export */ __syscall_rmdir: ___syscall_rmdir, - /** @export */ __syscall_sendto: ___syscall_sendto, - /** @export */ __syscall_socket: ___syscall_socket, - /** @export */ __syscall_stat64: ___syscall_stat64, - /** @export */ __syscall_statfs64: ___syscall_statfs64, - /** @export */ __syscall_symlink: ___syscall_symlink, - /** @export */ __syscall_unlinkat: ___syscall_unlinkat, - /** @export */ __syscall_utimensat: ___syscall_utimensat, - /** @export */ _abort_js: __abort_js, - /** @export */ _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic, - /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, - /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, - /** @export */ _emscripten_runtime_keepalive_clear: __emscripten_runtime_keepalive_clear, - /** @export */ _gmtime_js: __gmtime_js, - /** @export */ _localtime_js: __localtime_js, - /** @export */ _mktime_js: __mktime_js, - /** @export */ _mmap_js: __mmap_js, - /** @export */ _munmap_js: __munmap_js, - /** @export */ _setitimer_js: __setitimer_js, - /** @export */ _tzset_js: __tzset_js, - /** @export */ emscripten_date_now: _emscripten_date_now, - /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, - /** @export */ emscripten_get_now: _emscripten_get_now, - /** @export */ emscripten_resize_heap: _emscripten_resize_heap, - /** @export */ emscripten_sleep: _emscripten_sleep, - /** @export */ environ_get: _environ_get, - /** @export */ environ_sizes_get: _environ_sizes_get, - /** @export */ exit: _exit, - /** @export */ fd_close: _fd_close, - /** @export */ fd_fdstat_get: _fd_fdstat_get, - /** @export */ fd_read: _fd_read, - /** @export */ fd_seek: _fd_seek, - /** @export */ fd_write: _fd_write, - /** @export */ getaddrinfo: _getaddrinfo, - /** @export */ getnameinfo: _getnameinfo, - /** @export */ getprotobyname: _getprotobyname, - /** @export */ getprotobynumber: _getprotobynumber, - /** @export */ js_create_input_device: _js_create_input_device, - /** @export */ js_open_process: _js_open_process, - /** @export */ js_process_status: _js_process_status, - /** @export */ js_waitpid: _js_waitpid, - /** @export */ proc_exit: _proc_exit, - /** @export */ strftime: _strftime, - /** @export */ strftime_l: _strftime_l, - /** @export */ strptime: _strptime, - /** @export */ wasm_close: _wasm_close, - /** @export */ wasm_setsockopt: _wasm_setsockopt, - /** @export */ wasm_shutdown: _wasm_shutdown -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["__wasm_call_ctors"])(); - -var _malloc = a0 => (_malloc = wasmExports["malloc"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["wasm_read"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["fflush"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["wasm_popen"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["wasm_php_exec"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["php_pollfd_for"])(a0, a1, a2); - -var _htons = a0 => (_htons = wasmExports["htons"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["ntohs"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["htonl"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["wasm_sleep"])(a0); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["__wrap_select"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["wasm_add_cli_arg"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["run_cli"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["wasm_set_sapi_name"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["wasm_set_phpini_path"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["wasm_add_SERVER_entry"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["wasm_add_ENV_entry"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["wasm_set_query_string"])(a0); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + function _wasm_shutdown(socketd, how) { + return PHPWASM.shutdownSocket(socketd, how); + } + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + if (isAsyncifyImport) { + imports[x] = original = new WebAssembly.Suspending( + original + ); + } + } + } + }, + instrumentWasmExports(exports) { + var exportPattern = + /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; + Asyncify.asyncExports = new Set(); + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + let isAsyncifyExport = exportPattern.test(x); + if (isAsyncifyExport) { + Asyncify.asyncExports.add(original); + original = Asyncify.makeAsyncFunction(original); + } + ret[x] = (...args) => original(...args); + } else { + ret[x] = original; + } + } + return ret; + }, + asyncExports: null, + isAsyncExport(func) { + return Asyncify.asyncExports?.has(func); + }, + handleAsync: async (startAsync) => { + runtimeKeepalivePush(); + try { + return await startAsync(); + } finally { + runtimeKeepalivePop(); + } + }, + handleSleep(startAsync) { + return Asyncify.handleAsync(() => new Promise(startAsync)); + }, + makeAsyncFunction(original) { + return WebAssembly.promising(original); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + var stackSave = () => _emscripten_stack_get_current(); + + var stackRestore = (val) => __emscripten_stack_restore(val); + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func(...cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + if (asyncMode) return ret.then(onDone); + ret = onDone(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ SharpYuvConvert: _SharpYuvConvert, + /** @export */ SharpYuvGetConversionMatrix: + _SharpYuvGetConversionMatrix, + /** @export */ SharpYuvInit: _SharpYuvInit, + /** @export */ __assert_fail: ___assert_fail, + /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, + /** @export */ __asyncjs__js_module_onMessage: + __asyncjs__js_module_onMessage, + /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, + /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, + /** @export */ __call_sighandler: ___call_sighandler, + /** @export */ __syscall_accept4: ___syscall_accept4, + /** @export */ __syscall_bind: ___syscall_bind, + /** @export */ __syscall_chdir: ___syscall_chdir, + /** @export */ __syscall_chmod: ___syscall_chmod, + /** @export */ __syscall_connect: ___syscall_connect, + /** @export */ __syscall_dup: ___syscall_dup, + /** @export */ __syscall_dup3: ___syscall_dup3, + /** @export */ __syscall_faccessat: ___syscall_faccessat, + /** @export */ __syscall_fallocate: ___syscall_fallocate, + /** @export */ __syscall_fchmod: ___syscall_fchmod, + /** @export */ __syscall_fchown32: ___syscall_fchown32, + /** @export */ __syscall_fchownat: ___syscall_fchownat, + /** @export */ __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ __syscall_fdatasync: ___syscall_fdatasync, + /** @export */ __syscall_fstat64: ___syscall_fstat64, + /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, + /** @export */ __syscall_getcwd: ___syscall_getcwd, + /** @export */ __syscall_getdents64: ___syscall_getdents64, + /** @export */ __syscall_getpeername: ___syscall_getpeername, + /** @export */ __syscall_getsockname: ___syscall_getsockname, + /** @export */ __syscall_getsockopt: ___syscall_getsockopt, + /** @export */ __syscall_ioctl: ___syscall_ioctl, + /** @export */ __syscall_listen: ___syscall_listen, + /** @export */ __syscall_lstat64: ___syscall_lstat64, + /** @export */ __syscall_mkdirat: ___syscall_mkdirat, + /** @export */ __syscall_newfstatat: ___syscall_newfstatat, + /** @export */ __syscall_openat: ___syscall_openat, + /** @export */ __syscall_pipe: ___syscall_pipe, + /** @export */ __syscall_poll: ___syscall_poll, + /** @export */ __syscall_readlinkat: ___syscall_readlinkat, + /** @export */ __syscall_recvfrom: ___syscall_recvfrom, + /** @export */ __syscall_renameat: ___syscall_renameat, + /** @export */ __syscall_rmdir: ___syscall_rmdir, + /** @export */ __syscall_sendto: ___syscall_sendto, + /** @export */ __syscall_socket: ___syscall_socket, + /** @export */ __syscall_stat64: ___syscall_stat64, + /** @export */ __syscall_statfs64: ___syscall_statfs64, + /** @export */ __syscall_symlink: ___syscall_symlink, + /** @export */ __syscall_unlinkat: ___syscall_unlinkat, + /** @export */ __syscall_utimensat: ___syscall_utimensat, + /** @export */ _abort_js: __abort_js, + /** @export */ _emscripten_get_now_is_monotonic: + __emscripten_get_now_is_monotonic, + /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, + /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, + /** @export */ _emscripten_runtime_keepalive_clear: + __emscripten_runtime_keepalive_clear, + /** @export */ _gmtime_js: __gmtime_js, + /** @export */ _localtime_js: __localtime_js, + /** @export */ _mktime_js: __mktime_js, + /** @export */ _mmap_js: __mmap_js, + /** @export */ _munmap_js: __munmap_js, + /** @export */ _setitimer_js: __setitimer_js, + /** @export */ _tzset_js: __tzset_js, + /** @export */ emscripten_date_now: _emscripten_date_now, + /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, + /** @export */ emscripten_get_now: _emscripten_get_now, + /** @export */ emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ emscripten_sleep: _emscripten_sleep, + /** @export */ environ_get: _environ_get, + /** @export */ environ_sizes_get: _environ_sizes_get, + /** @export */ exit: _exit, + /** @export */ fd_close: _fd_close, + /** @export */ fd_fdstat_get: _fd_fdstat_get, + /** @export */ fd_read: _fd_read, + /** @export */ fd_seek: _fd_seek, + /** @export */ fd_write: _fd_write, + /** @export */ getaddrinfo: _getaddrinfo, + /** @export */ getnameinfo: _getnameinfo, + /** @export */ getprotobyname: _getprotobyname, + /** @export */ getprotobynumber: _getprotobynumber, + /** @export */ js_create_input_device: _js_create_input_device, + /** @export */ js_open_process: _js_open_process, + /** @export */ js_process_status: _js_process_status, + /** @export */ js_waitpid: _js_waitpid, + /** @export */ proc_exit: _proc_exit, + /** @export */ strftime: _strftime, + /** @export */ strftime_l: _strftime_l, + /** @export */ strptime: _strptime, + /** @export */ wasm_close: _wasm_close, + /** @export */ wasm_setsockopt: _wasm_setsockopt, + /** @export */ wasm_shutdown: _wasm_shutdown, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => + (___wasm_call_ctors = wasmExports['__wasm_call_ctors'])(); + + var _malloc = (a0) => (_malloc = wasmExports['malloc'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['wasm_read'])( + a0, + a1, + a2 + )); + + var _fflush = (a0) => (_fflush = wasmExports['fflush'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['wasm_popen'])( + a0, + a1 + )); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = + wasmExports['wasm_php_exec'])(a0, a1, a2, a3)); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = + wasmExports['php_pollfd_for'])(a0, a1, a2)); + + var _htons = (a0) => (_htons = wasmExports['htons'])(a0); + + var _ntohs = (a0) => (_ntohs = wasmExports['ntohs'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['htonl'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['wasm_sleep'])(a0)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = + wasmExports['__wrap_select'])(a0, a1, a2, a3, a4)); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = + wasmExports['wasm_add_cli_arg'])(a0)); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['run_cli'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['wasm_set_sapi_name'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['wasm_set_phpini_path'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['wasm_add_SERVER_entry'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['wasm_add_ENV_entry'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['wasm_set_query_string'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['wasm_set_path_translated'])(a0)); -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["wasm_set_path_translated"])(a0); + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['wasm_set_skip_shebang'])(a0)); -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["wasm_set_skip_shebang"])(a0); + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['wasm_set_request_uri'])(a0)); -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["wasm_set_request_uri"])(a0); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['wasm_set_request_method'])(a0)); -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["wasm_set_request_method"])(a0); + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['wasm_set_request_host'])(a0)); -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["wasm_set_request_host"])(a0); + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['wasm_set_content_type'])(a0)); -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["wasm_set_content_type"])(a0); + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['wasm_set_request_body'])(a0)); -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["wasm_set_request_body"])(a0); + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['wasm_set_content_length'])(a0)); -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["wasm_set_content_length"])(a0); + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = + wasmExports['wasm_set_cookies'])(a0)); -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["wasm_set_cookies"])(a0); + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['wasm_set_request_port'])(a0)); -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["wasm_set_request_port"])(a0); + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['wasm_sapi_request_shutdown'])()); -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["wasm_sapi_request_shutdown"])(); + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['wasm_sapi_handle_request'])()); -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["wasm_sapi_handle_request"])(); + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = + wasmExports['php_wasm_init'])()); -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["php_wasm_init"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["wasm_free"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["__funcs_on_exit"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["emscripten_builtin_memalign"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["_emscripten_timeout"])(a0, a1); - -var ___trap = () => (___trap = wasmExports["__trap"])(); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["_emscripten_tempret_set"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"])(); - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['wasm_free'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var ___funcs_on_exit = () => + (___funcs_on_exit = wasmExports['__funcs_on_exit'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = + wasmExports['emscripten_builtin_memalign'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['_emscripten_timeout'])(a0, a1); + + var ___trap = () => (___trap = wasmExports['__trap'])(); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['_emscripten_tempret_set'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['_emscripten_stack_restore'])( + a0 + ); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = + wasmExports['emscripten_stack_get_current'])(); + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/jspi/php_8_1.js b/packages/php-wasm/node/jspi/php_8_1.js index f8fbdcff44..8212c55df4 100644 --- a/packages/php-wasm/node/jspi/php_8_1.js +++ b/packages/php-wasm/node/jspi/php_8_1.js @@ -1,6689 +1,7748 @@ -const dependencyFilename = __dirname + '/8_1_23/php_8_1.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 14271326; +const dependencyFilename = __dirname + '/8_1_23/php_8_1.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 14271326; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - if (runtimeInitialized) { - ___trap(); - } - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - Asyncify.instrumentWasmImports(wasmImports); - return { - "env": wasmImports, - "wasi_snapshot_preview1": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["memory"]; - updateMemoryViews(); - wasmTable = wasmExports["__indirect_function_table"]; - addOnInit(wasmExports["__wasm_call_ctors"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); - }); -} - -__asyncjs__js_popen_to_file.sig = "iiii"; - -function __asyncjs__wasm_poll_socket(socketd, events, timeout) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); - }); -} - -__asyncjs__wasm_poll_socket.sig = "iiii"; - -function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); - }); -} - -__asyncjs__js_fd_read.sig = "iiiii"; - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -__asyncjs__js_module_onMessage.sig = "iii"; - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -/** @type {function(...*):?} */ function _SharpYuvConvert() { - abort("missing function: SharpYuvConvert"); -} - -_SharpYuvConvert.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { - abort("missing function: SharpYuvGetConversionMatrix"); -} - -_SharpYuvGetConversionMatrix.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvInit() { - abort("missing function: SharpYuvInit"); -} - -_SharpYuvInit.stub = true; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var wasmTableMirror = []; - -/** @type {WebAssembly.Table} */ var wasmTable; - -var getWasmTableEntry = funcPtr => { - var func = wasmTableMirror[funcPtr]; - if (!func) { - if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; - wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); - if (Asyncify.isAsyncExport(func)) { - wasmTableMirror[funcPtr] = func = Asyncify.makeAsyncFunction(func); - } - } - return func; -}; - -var ___call_sighandler = (fp, sig) => getWasmTableEntry(fp)(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_fallocate(fd, mode, offset_low, offset_high, len_low, len_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - var len = convertI32PairToI53Checked(len_low, len_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.allocate(stream, offset, len); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fdatasync(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -/** @type {function(...*):?} */ function _getcontext() { - abort("missing function: getcontext"); -} - -_getcontext.stub = true; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - if (typeof data === "number") { - data = new Uint8Array([ data ]); - } - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -/** @type {function(...*):?} */ function _makecontext() { - abort("missing function: makecontext"); -} - -_makecontext.stub = true; - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + if (runtimeInitialized) { + ___trap(); + } + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + Asyncify.instrumentWasmImports(wasmImports); + return { + env: wasmImports, + wasi_snapshot_preview1: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['memory']; + updateMemoryViews(); + wasmTable = wasmExports['__indirect_function_table']; + addOnInit(wasmExports['__wasm_call_ctors']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce( + (acc, curr) => acc + curr.length, + 0 + ) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + }); + } + + __asyncjs__js_popen_to_file.sig = 'iiii'; + + function __asyncjs__wasm_poll_socket(socketd, events, timeout) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => + polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + }); + } + + __asyncjs__wasm_poll_socket.sig = 'iiii'; + + function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + }); + } + + __asyncjs__js_fd_read.sig = 'iiiii'; + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + __asyncjs__js_module_onMessage.sig = 'iii'; + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + /** @type {function(...*):?} */ function _SharpYuvConvert() { + abort('missing function: SharpYuvConvert'); + } + + _SharpYuvConvert.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { + abort('missing function: SharpYuvGetConversionMatrix'); + } + + _SharpYuvGetConversionMatrix.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvInit() { + abort('missing function: SharpYuvInit'); + } + + _SharpYuvInit.stub = true; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var wasmTableMirror = []; + + /** @type {WebAssembly.Table} */ var wasmTable; + + var getWasmTableEntry = (funcPtr) => { + var func = wasmTableMirror[funcPtr]; + if (!func) { + if (funcPtr >= wasmTableMirror.length) + wasmTableMirror.length = funcPtr + 1; + wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); + if (Asyncify.isAsyncExport(func)) { + wasmTableMirror[funcPtr] = func = + Asyncify.makeAsyncFunction(func); + } + } + return func; + }; + + var ___call_sighandler = (fp, sig) => getWasmTableEntry(fp)(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_fallocate( + fd, + mode, + offset_low, + offset_high, + len_low, + len_high + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + var len = convertI32PairToI53Checked(len_low, len_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.allocate(stream, offset, len); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fdatasync(fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + /** @type {function(...*):?} */ function _getcontext() { + abort('missing function: getcontext'); + } + + _getcontext.stub = true; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + if (typeof data === 'number') { + data = new Uint8Array([data]); + } + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + /** @type {function(...*):?} */ function _makecontext() { + abort('missing function: makecontext'); + } + + _makecontext.stub = true; + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6694,502 +7753,613 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -/** @type {function(...*):?} */ function _swapcontext() { - abort("missing function: swapcontext"); -} - -_swapcontext.stub = true; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -function _wasm_shutdown(socketd, how) { - return PHPWASM.shutdownSocket(socketd, how); -} - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - if (isAsyncifyImport) { - imports[x] = original = new WebAssembly.Suspending(original); - } - } - } - }, - instrumentWasmExports(exports) { - var exportPattern = /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; - Asyncify.asyncExports = new Set; - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - let isAsyncifyExport = exportPattern.test(x); - if (isAsyncifyExport) { - Asyncify.asyncExports.add(original); - original = Asyncify.makeAsyncFunction(original); - } - ret[x] = (...args) => original(...args); - } else { - ret[x] = original; - } - } - return ret; - }, - asyncExports: null, - isAsyncExport(func) { - return Asyncify.asyncExports?.has(func); - }, - handleAsync: async startAsync => { - runtimeKeepalivePush(); - try { - return await startAsync(); - } finally { - runtimeKeepalivePop(); - } - }, - handleSleep(startAsync) { - return Asyncify.handleAsync(() => new Promise(startAsync)); - }, - makeAsyncFunction(original) { - return WebAssembly.promising(original); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -var stackSave = () => _emscripten_stack_get_current(); - -var stackRestore = val => __emscripten_stack_restore(val); - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func(...cArgs); - function onDone(ret) { - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - if (asyncMode) return ret.then(onDone); - ret = onDone(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ SharpYuvConvert: _SharpYuvConvert, - /** @export */ SharpYuvGetConversionMatrix: _SharpYuvGetConversionMatrix, - /** @export */ SharpYuvInit: _SharpYuvInit, - /** @export */ __assert_fail: ___assert_fail, - /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, - /** @export */ __asyncjs__js_module_onMessage: __asyncjs__js_module_onMessage, - /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, - /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, - /** @export */ __call_sighandler: ___call_sighandler, - /** @export */ __syscall_accept4: ___syscall_accept4, - /** @export */ __syscall_bind: ___syscall_bind, - /** @export */ __syscall_chdir: ___syscall_chdir, - /** @export */ __syscall_chmod: ___syscall_chmod, - /** @export */ __syscall_connect: ___syscall_connect, - /** @export */ __syscall_dup: ___syscall_dup, - /** @export */ __syscall_dup3: ___syscall_dup3, - /** @export */ __syscall_faccessat: ___syscall_faccessat, - /** @export */ __syscall_fallocate: ___syscall_fallocate, - /** @export */ __syscall_fchmod: ___syscall_fchmod, - /** @export */ __syscall_fchown32: ___syscall_fchown32, - /** @export */ __syscall_fchownat: ___syscall_fchownat, - /** @export */ __syscall_fcntl64: ___syscall_fcntl64, - /** @export */ __syscall_fdatasync: ___syscall_fdatasync, - /** @export */ __syscall_fstat64: ___syscall_fstat64, - /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, - /** @export */ __syscall_getcwd: ___syscall_getcwd, - /** @export */ __syscall_getdents64: ___syscall_getdents64, - /** @export */ __syscall_getpeername: ___syscall_getpeername, - /** @export */ __syscall_getsockname: ___syscall_getsockname, - /** @export */ __syscall_getsockopt: ___syscall_getsockopt, - /** @export */ __syscall_ioctl: ___syscall_ioctl, - /** @export */ __syscall_listen: ___syscall_listen, - /** @export */ __syscall_lstat64: ___syscall_lstat64, - /** @export */ __syscall_mkdirat: ___syscall_mkdirat, - /** @export */ __syscall_newfstatat: ___syscall_newfstatat, - /** @export */ __syscall_openat: ___syscall_openat, - /** @export */ __syscall_pipe: ___syscall_pipe, - /** @export */ __syscall_poll: ___syscall_poll, - /** @export */ __syscall_readlinkat: ___syscall_readlinkat, - /** @export */ __syscall_recvfrom: ___syscall_recvfrom, - /** @export */ __syscall_renameat: ___syscall_renameat, - /** @export */ __syscall_rmdir: ___syscall_rmdir, - /** @export */ __syscall_sendto: ___syscall_sendto, - /** @export */ __syscall_socket: ___syscall_socket, - /** @export */ __syscall_stat64: ___syscall_stat64, - /** @export */ __syscall_statfs64: ___syscall_statfs64, - /** @export */ __syscall_symlink: ___syscall_symlink, - /** @export */ __syscall_unlinkat: ___syscall_unlinkat, - /** @export */ __syscall_utimensat: ___syscall_utimensat, - /** @export */ _abort_js: __abort_js, - /** @export */ _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic, - /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, - /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, - /** @export */ _emscripten_runtime_keepalive_clear: __emscripten_runtime_keepalive_clear, - /** @export */ _gmtime_js: __gmtime_js, - /** @export */ _localtime_js: __localtime_js, - /** @export */ _mktime_js: __mktime_js, - /** @export */ _mmap_js: __mmap_js, - /** @export */ _munmap_js: __munmap_js, - /** @export */ _setitimer_js: __setitimer_js, - /** @export */ _tzset_js: __tzset_js, - /** @export */ emscripten_date_now: _emscripten_date_now, - /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, - /** @export */ emscripten_get_now: _emscripten_get_now, - /** @export */ emscripten_resize_heap: _emscripten_resize_heap, - /** @export */ emscripten_sleep: _emscripten_sleep, - /** @export */ environ_get: _environ_get, - /** @export */ environ_sizes_get: _environ_sizes_get, - /** @export */ exit: _exit, - /** @export */ fd_close: _fd_close, - /** @export */ fd_fdstat_get: _fd_fdstat_get, - /** @export */ fd_read: _fd_read, - /** @export */ fd_seek: _fd_seek, - /** @export */ fd_sync: _fd_sync, - /** @export */ fd_write: _fd_write, - /** @export */ getaddrinfo: _getaddrinfo, - /** @export */ getcontext: _getcontext, - /** @export */ getnameinfo: _getnameinfo, - /** @export */ getprotobyname: _getprotobyname, - /** @export */ getprotobynumber: _getprotobynumber, - /** @export */ js_create_input_device: _js_create_input_device, - /** @export */ js_open_process: _js_open_process, - /** @export */ js_process_status: _js_process_status, - /** @export */ js_waitpid: _js_waitpid, - /** @export */ makecontext: _makecontext, - /** @export */ proc_exit: _proc_exit, - /** @export */ strftime: _strftime, - /** @export */ strftime_l: _strftime_l, - /** @export */ strptime: _strptime, - /** @export */ swapcontext: _swapcontext, - /** @export */ wasm_close: _wasm_close, - /** @export */ wasm_setsockopt: _wasm_setsockopt, - /** @export */ wasm_shutdown: _wasm_shutdown -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["__wasm_call_ctors"])(); - -var _malloc = a0 => (_malloc = wasmExports["malloc"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["wasm_read"])(a0, a1, a2); - -var _fflush = a0 => (_fflush = wasmExports["fflush"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["wasm_popen"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["wasm_php_exec"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["php_pollfd_for"])(a0, a1, a2); - -var _htons = a0 => (_htons = wasmExports["htons"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["ntohs"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["htonl"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["wasm_sleep"])(a0); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["__wrap_select"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["wasm_add_cli_arg"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["run_cli"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["wasm_set_sapi_name"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["wasm_set_phpini_path"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["wasm_add_SERVER_entry"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["wasm_add_ENV_entry"])(a0, a1); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + /** @type {function(...*):?} */ function _swapcontext() { + abort('missing function: swapcontext'); + } + + _swapcontext.stub = true; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + function _wasm_shutdown(socketd, how) { + return PHPWASM.shutdownSocket(socketd, how); + } + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + if (isAsyncifyImport) { + imports[x] = original = new WebAssembly.Suspending( + original + ); + } + } + } + }, + instrumentWasmExports(exports) { + var exportPattern = + /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; + Asyncify.asyncExports = new Set(); + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + let isAsyncifyExport = exportPattern.test(x); + if (isAsyncifyExport) { + Asyncify.asyncExports.add(original); + original = Asyncify.makeAsyncFunction(original); + } + ret[x] = (...args) => original(...args); + } else { + ret[x] = original; + } + } + return ret; + }, + asyncExports: null, + isAsyncExport(func) { + return Asyncify.asyncExports?.has(func); + }, + handleAsync: async (startAsync) => { + runtimeKeepalivePush(); + try { + return await startAsync(); + } finally { + runtimeKeepalivePop(); + } + }, + handleSleep(startAsync) { + return Asyncify.handleAsync(() => new Promise(startAsync)); + }, + makeAsyncFunction(original) { + return WebAssembly.promising(original); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + var stackSave = () => _emscripten_stack_get_current(); + + var stackRestore = (val) => __emscripten_stack_restore(val); + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func(...cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + if (asyncMode) return ret.then(onDone); + ret = onDone(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ SharpYuvConvert: _SharpYuvConvert, + /** @export */ SharpYuvGetConversionMatrix: + _SharpYuvGetConversionMatrix, + /** @export */ SharpYuvInit: _SharpYuvInit, + /** @export */ __assert_fail: ___assert_fail, + /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, + /** @export */ __asyncjs__js_module_onMessage: + __asyncjs__js_module_onMessage, + /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, + /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, + /** @export */ __call_sighandler: ___call_sighandler, + /** @export */ __syscall_accept4: ___syscall_accept4, + /** @export */ __syscall_bind: ___syscall_bind, + /** @export */ __syscall_chdir: ___syscall_chdir, + /** @export */ __syscall_chmod: ___syscall_chmod, + /** @export */ __syscall_connect: ___syscall_connect, + /** @export */ __syscall_dup: ___syscall_dup, + /** @export */ __syscall_dup3: ___syscall_dup3, + /** @export */ __syscall_faccessat: ___syscall_faccessat, + /** @export */ __syscall_fallocate: ___syscall_fallocate, + /** @export */ __syscall_fchmod: ___syscall_fchmod, + /** @export */ __syscall_fchown32: ___syscall_fchown32, + /** @export */ __syscall_fchownat: ___syscall_fchownat, + /** @export */ __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ __syscall_fdatasync: ___syscall_fdatasync, + /** @export */ __syscall_fstat64: ___syscall_fstat64, + /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, + /** @export */ __syscall_getcwd: ___syscall_getcwd, + /** @export */ __syscall_getdents64: ___syscall_getdents64, + /** @export */ __syscall_getpeername: ___syscall_getpeername, + /** @export */ __syscall_getsockname: ___syscall_getsockname, + /** @export */ __syscall_getsockopt: ___syscall_getsockopt, + /** @export */ __syscall_ioctl: ___syscall_ioctl, + /** @export */ __syscall_listen: ___syscall_listen, + /** @export */ __syscall_lstat64: ___syscall_lstat64, + /** @export */ __syscall_mkdirat: ___syscall_mkdirat, + /** @export */ __syscall_newfstatat: ___syscall_newfstatat, + /** @export */ __syscall_openat: ___syscall_openat, + /** @export */ __syscall_pipe: ___syscall_pipe, + /** @export */ __syscall_poll: ___syscall_poll, + /** @export */ __syscall_readlinkat: ___syscall_readlinkat, + /** @export */ __syscall_recvfrom: ___syscall_recvfrom, + /** @export */ __syscall_renameat: ___syscall_renameat, + /** @export */ __syscall_rmdir: ___syscall_rmdir, + /** @export */ __syscall_sendto: ___syscall_sendto, + /** @export */ __syscall_socket: ___syscall_socket, + /** @export */ __syscall_stat64: ___syscall_stat64, + /** @export */ __syscall_statfs64: ___syscall_statfs64, + /** @export */ __syscall_symlink: ___syscall_symlink, + /** @export */ __syscall_unlinkat: ___syscall_unlinkat, + /** @export */ __syscall_utimensat: ___syscall_utimensat, + /** @export */ _abort_js: __abort_js, + /** @export */ _emscripten_get_now_is_monotonic: + __emscripten_get_now_is_monotonic, + /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, + /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, + /** @export */ _emscripten_runtime_keepalive_clear: + __emscripten_runtime_keepalive_clear, + /** @export */ _gmtime_js: __gmtime_js, + /** @export */ _localtime_js: __localtime_js, + /** @export */ _mktime_js: __mktime_js, + /** @export */ _mmap_js: __mmap_js, + /** @export */ _munmap_js: __munmap_js, + /** @export */ _setitimer_js: __setitimer_js, + /** @export */ _tzset_js: __tzset_js, + /** @export */ emscripten_date_now: _emscripten_date_now, + /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, + /** @export */ emscripten_get_now: _emscripten_get_now, + /** @export */ emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ emscripten_sleep: _emscripten_sleep, + /** @export */ environ_get: _environ_get, + /** @export */ environ_sizes_get: _environ_sizes_get, + /** @export */ exit: _exit, + /** @export */ fd_close: _fd_close, + /** @export */ fd_fdstat_get: _fd_fdstat_get, + /** @export */ fd_read: _fd_read, + /** @export */ fd_seek: _fd_seek, + /** @export */ fd_sync: _fd_sync, + /** @export */ fd_write: _fd_write, + /** @export */ getaddrinfo: _getaddrinfo, + /** @export */ getcontext: _getcontext, + /** @export */ getnameinfo: _getnameinfo, + /** @export */ getprotobyname: _getprotobyname, + /** @export */ getprotobynumber: _getprotobynumber, + /** @export */ js_create_input_device: _js_create_input_device, + /** @export */ js_open_process: _js_open_process, + /** @export */ js_process_status: _js_process_status, + /** @export */ js_waitpid: _js_waitpid, + /** @export */ makecontext: _makecontext, + /** @export */ proc_exit: _proc_exit, + /** @export */ strftime: _strftime, + /** @export */ strftime_l: _strftime_l, + /** @export */ strptime: _strptime, + /** @export */ swapcontext: _swapcontext, + /** @export */ wasm_close: _wasm_close, + /** @export */ wasm_setsockopt: _wasm_setsockopt, + /** @export */ wasm_shutdown: _wasm_shutdown, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => + (___wasm_call_ctors = wasmExports['__wasm_call_ctors'])(); + + var _malloc = (a0) => (_malloc = wasmExports['malloc'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['wasm_read'])( + a0, + a1, + a2 + )); + + var _fflush = (a0) => (_fflush = wasmExports['fflush'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['wasm_popen'])( + a0, + a1 + )); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = + wasmExports['wasm_php_exec'])(a0, a1, a2, a3)); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = + wasmExports['php_pollfd_for'])(a0, a1, a2)); + + var _htons = (a0) => (_htons = wasmExports['htons'])(a0); + + var _ntohs = (a0) => (_ntohs = wasmExports['ntohs'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['htonl'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['wasm_sleep'])(a0)); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = + wasmExports['__wrap_select'])(a0, a1, a2, a3, a4)); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = + wasmExports['wasm_add_cli_arg'])(a0)); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['run_cli'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['wasm_set_sapi_name'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['wasm_set_phpini_path'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['wasm_add_SERVER_entry'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['wasm_add_ENV_entry'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['wasm_set_query_string'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['wasm_set_path_translated'])(a0)); -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["wasm_set_query_string"])(a0); + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['wasm_set_skip_shebang'])(a0)); -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["wasm_set_path_translated"])(a0); + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['wasm_set_request_uri'])(a0)); -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["wasm_set_skip_shebang"])(a0); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['wasm_set_request_method'])(a0)); -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["wasm_set_request_uri"])(a0); + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['wasm_set_request_host'])(a0)); -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["wasm_set_request_method"])(a0); + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['wasm_set_content_type'])(a0)); -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["wasm_set_request_host"])(a0); + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['wasm_set_request_body'])(a0)); -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["wasm_set_content_type"])(a0); + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['wasm_set_content_length'])(a0)); -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["wasm_set_request_body"])(a0); + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = + wasmExports['wasm_set_cookies'])(a0)); -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["wasm_set_content_length"])(a0); + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['wasm_set_request_port'])(a0)); -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["wasm_set_cookies"])(a0); + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['wasm_sapi_request_shutdown'])()); -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["wasm_set_request_port"])(a0); + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['wasm_sapi_handle_request'])()); -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["wasm_sapi_request_shutdown"])(); + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = + wasmExports['php_wasm_init'])()); -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["wasm_sapi_handle_request"])(); - -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["php_wasm_init"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["wasm_free"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["__funcs_on_exit"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["emscripten_builtin_memalign"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["_emscripten_timeout"])(a0, a1); - -var ___trap = () => (___trap = wasmExports["__trap"])(); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["_emscripten_tempret_set"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"])(); - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['wasm_free'])(a0)); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var ___funcs_on_exit = () => + (___funcs_on_exit = wasmExports['__funcs_on_exit'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = + wasmExports['emscripten_builtin_memalign'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['_emscripten_timeout'])(a0, a1); + + var ___trap = () => (___trap = wasmExports['__trap'])(); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['_emscripten_tempret_set'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['_emscripten_stack_restore'])( + a0 + ); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = + wasmExports['emscripten_stack_get_current'])(); + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/jspi/php_8_2.js b/packages/php-wasm/node/jspi/php_8_2.js index 35f8861966..a3ac2b4378 100644 --- a/packages/php-wasm/node/jspi/php_8_2.js +++ b/packages/php-wasm/node/jspi/php_8_2.js @@ -1,6695 +1,7754 @@ -const dependencyFilename = __dirname + '/8_2_10/php_8_2.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 14527957; +const dependencyFilename = __dirname + '/8_2_10/php_8_2.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 14527957; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - if (runtimeInitialized) { - ___trap(); - } - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - Asyncify.instrumentWasmImports(wasmImports); - return { - "env": wasmImports, - "wasi_snapshot_preview1": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["memory"]; - updateMemoryViews(); - wasmTable = wasmExports["__indirect_function_table"]; - addOnInit(wasmExports["__wasm_call_ctors"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); - }); -} - -__asyncjs__js_popen_to_file.sig = "iiii"; - -function __asyncjs__wasm_poll_socket(socketd, events, timeout) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); - }); -} - -__asyncjs__wasm_poll_socket.sig = "iiii"; - -function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); - }); -} - -__asyncjs__js_fd_read.sig = "iiiii"; - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -__asyncjs__js_module_onMessage.sig = "iii"; - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -/** @type {function(...*):?} */ function _SharpYuvConvert() { - abort("missing function: SharpYuvConvert"); -} - -_SharpYuvConvert.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { - abort("missing function: SharpYuvGetConversionMatrix"); -} - -_SharpYuvGetConversionMatrix.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvInit() { - abort("missing function: SharpYuvInit"); -} - -_SharpYuvInit.stub = true; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var wasmTableMirror = []; - -/** @type {WebAssembly.Table} */ var wasmTable; - -var getWasmTableEntry = funcPtr => { - var func = wasmTableMirror[funcPtr]; - if (!func) { - if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; - wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); - if (Asyncify.isAsyncExport(func)) { - wasmTableMirror[funcPtr] = func = Asyncify.makeAsyncFunction(func); - } - } - return func; -}; - -var ___call_sighandler = (fp, sig) => getWasmTableEntry(fp)(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_fallocate(fd, mode, offset_low, offset_high, len_low, len_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - var len = convertI32PairToI53Checked(len_low, len_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.allocate(stream, offset, len); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fdatasync(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -/** @type {function(...*):?} */ function _getcontext() { - abort("missing function: getcontext"); -} - -_getcontext.stub = true; - -/** @type {function(...*):?} */ function _getdtablesize() { - abort("missing function: getdtablesize"); -} - -_getdtablesize.stub = true; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - if (typeof data === "number") { - data = new Uint8Array([ data ]); - } - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -/** @type {function(...*):?} */ function _makecontext() { - abort("missing function: makecontext"); -} - -_makecontext.stub = true; - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + if (runtimeInitialized) { + ___trap(); + } + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + Asyncify.instrumentWasmImports(wasmImports); + return { + env: wasmImports, + wasi_snapshot_preview1: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['memory']; + updateMemoryViews(); + wasmTable = wasmExports['__indirect_function_table']; + addOnInit(wasmExports['__wasm_call_ctors']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce( + (acc, curr) => acc + curr.length, + 0 + ) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + }); + } + + __asyncjs__js_popen_to_file.sig = 'iiii'; + + function __asyncjs__wasm_poll_socket(socketd, events, timeout) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => + polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + }); + } + + __asyncjs__wasm_poll_socket.sig = 'iiii'; + + function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + }); + } + + __asyncjs__js_fd_read.sig = 'iiiii'; + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + __asyncjs__js_module_onMessage.sig = 'iii'; + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + /** @type {function(...*):?} */ function _SharpYuvConvert() { + abort('missing function: SharpYuvConvert'); + } + + _SharpYuvConvert.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { + abort('missing function: SharpYuvGetConversionMatrix'); + } + + _SharpYuvGetConversionMatrix.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvInit() { + abort('missing function: SharpYuvInit'); + } + + _SharpYuvInit.stub = true; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var wasmTableMirror = []; + + /** @type {WebAssembly.Table} */ var wasmTable; + + var getWasmTableEntry = (funcPtr) => { + var func = wasmTableMirror[funcPtr]; + if (!func) { + if (funcPtr >= wasmTableMirror.length) + wasmTableMirror.length = funcPtr + 1; + wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); + if (Asyncify.isAsyncExport(func)) { + wasmTableMirror[funcPtr] = func = + Asyncify.makeAsyncFunction(func); + } + } + return func; + }; + + var ___call_sighandler = (fp, sig) => getWasmTableEntry(fp)(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_fallocate( + fd, + mode, + offset_low, + offset_high, + len_low, + len_high + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + var len = convertI32PairToI53Checked(len_low, len_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.allocate(stream, offset, len); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fdatasync(fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + /** @type {function(...*):?} */ function _getcontext() { + abort('missing function: getcontext'); + } + + _getcontext.stub = true; + + /** @type {function(...*):?} */ function _getdtablesize() { + abort('missing function: getdtablesize'); + } + + _getdtablesize.stub = true; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + if (typeof data === 'number') { + data = new Uint8Array([data]); + } + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + /** @type {function(...*):?} */ function _makecontext() { + abort('missing function: makecontext'); + } + + _makecontext.stub = true; + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6700,503 +7759,614 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -/** @type {function(...*):?} */ function _swapcontext() { - abort("missing function: swapcontext"); -} - -_swapcontext.stub = true; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -function _wasm_shutdown(socketd, how) { - return PHPWASM.shutdownSocket(socketd, how); -} - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - if (isAsyncifyImport) { - imports[x] = original = new WebAssembly.Suspending(original); - } - } - } - }, - instrumentWasmExports(exports) { - var exportPattern = /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; - Asyncify.asyncExports = new Set; - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - let isAsyncifyExport = exportPattern.test(x); - if (isAsyncifyExport) { - Asyncify.asyncExports.add(original); - original = Asyncify.makeAsyncFunction(original); - } - ret[x] = (...args) => original(...args); - } else { - ret[x] = original; - } - } - return ret; - }, - asyncExports: null, - isAsyncExport(func) { - return Asyncify.asyncExports?.has(func); - }, - handleAsync: async startAsync => { - runtimeKeepalivePush(); - try { - return await startAsync(); - } finally { - runtimeKeepalivePop(); - } - }, - handleSleep(startAsync) { - return Asyncify.handleAsync(() => new Promise(startAsync)); - }, - makeAsyncFunction(original) { - return WebAssembly.promising(original); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -var stackSave = () => _emscripten_stack_get_current(); - -var stackRestore = val => __emscripten_stack_restore(val); - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func(...cArgs); - function onDone(ret) { - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - if (asyncMode) return ret.then(onDone); - ret = onDone(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ SharpYuvConvert: _SharpYuvConvert, - /** @export */ SharpYuvGetConversionMatrix: _SharpYuvGetConversionMatrix, - /** @export */ SharpYuvInit: _SharpYuvInit, - /** @export */ __assert_fail: ___assert_fail, - /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, - /** @export */ __asyncjs__js_module_onMessage: __asyncjs__js_module_onMessage, - /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, - /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, - /** @export */ __call_sighandler: ___call_sighandler, - /** @export */ __syscall_accept4: ___syscall_accept4, - /** @export */ __syscall_bind: ___syscall_bind, - /** @export */ __syscall_chdir: ___syscall_chdir, - /** @export */ __syscall_chmod: ___syscall_chmod, - /** @export */ __syscall_connect: ___syscall_connect, - /** @export */ __syscall_dup: ___syscall_dup, - /** @export */ __syscall_dup3: ___syscall_dup3, - /** @export */ __syscall_faccessat: ___syscall_faccessat, - /** @export */ __syscall_fallocate: ___syscall_fallocate, - /** @export */ __syscall_fchmod: ___syscall_fchmod, - /** @export */ __syscall_fchown32: ___syscall_fchown32, - /** @export */ __syscall_fchownat: ___syscall_fchownat, - /** @export */ __syscall_fcntl64: ___syscall_fcntl64, - /** @export */ __syscall_fdatasync: ___syscall_fdatasync, - /** @export */ __syscall_fstat64: ___syscall_fstat64, - /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, - /** @export */ __syscall_getcwd: ___syscall_getcwd, - /** @export */ __syscall_getdents64: ___syscall_getdents64, - /** @export */ __syscall_getpeername: ___syscall_getpeername, - /** @export */ __syscall_getsockname: ___syscall_getsockname, - /** @export */ __syscall_getsockopt: ___syscall_getsockopt, - /** @export */ __syscall_ioctl: ___syscall_ioctl, - /** @export */ __syscall_listen: ___syscall_listen, - /** @export */ __syscall_lstat64: ___syscall_lstat64, - /** @export */ __syscall_mkdirat: ___syscall_mkdirat, - /** @export */ __syscall_newfstatat: ___syscall_newfstatat, - /** @export */ __syscall_openat: ___syscall_openat, - /** @export */ __syscall_pipe: ___syscall_pipe, - /** @export */ __syscall_poll: ___syscall_poll, - /** @export */ __syscall_readlinkat: ___syscall_readlinkat, - /** @export */ __syscall_recvfrom: ___syscall_recvfrom, - /** @export */ __syscall_renameat: ___syscall_renameat, - /** @export */ __syscall_rmdir: ___syscall_rmdir, - /** @export */ __syscall_sendto: ___syscall_sendto, - /** @export */ __syscall_socket: ___syscall_socket, - /** @export */ __syscall_stat64: ___syscall_stat64, - /** @export */ __syscall_statfs64: ___syscall_statfs64, - /** @export */ __syscall_symlink: ___syscall_symlink, - /** @export */ __syscall_unlinkat: ___syscall_unlinkat, - /** @export */ __syscall_utimensat: ___syscall_utimensat, - /** @export */ _abort_js: __abort_js, - /** @export */ _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic, - /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, - /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, - /** @export */ _emscripten_runtime_keepalive_clear: __emscripten_runtime_keepalive_clear, - /** @export */ _gmtime_js: __gmtime_js, - /** @export */ _localtime_js: __localtime_js, - /** @export */ _mktime_js: __mktime_js, - /** @export */ _mmap_js: __mmap_js, - /** @export */ _munmap_js: __munmap_js, - /** @export */ _setitimer_js: __setitimer_js, - /** @export */ _tzset_js: __tzset_js, - /** @export */ emscripten_date_now: _emscripten_date_now, - /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, - /** @export */ emscripten_get_now: _emscripten_get_now, - /** @export */ emscripten_resize_heap: _emscripten_resize_heap, - /** @export */ emscripten_sleep: _emscripten_sleep, - /** @export */ environ_get: _environ_get, - /** @export */ environ_sizes_get: _environ_sizes_get, - /** @export */ exit: _exit, - /** @export */ fd_close: _fd_close, - /** @export */ fd_fdstat_get: _fd_fdstat_get, - /** @export */ fd_read: _fd_read, - /** @export */ fd_seek: _fd_seek, - /** @export */ fd_sync: _fd_sync, - /** @export */ fd_write: _fd_write, - /** @export */ getaddrinfo: _getaddrinfo, - /** @export */ getcontext: _getcontext, - /** @export */ getdtablesize: _getdtablesize, - /** @export */ getnameinfo: _getnameinfo, - /** @export */ getprotobyname: _getprotobyname, - /** @export */ getprotobynumber: _getprotobynumber, - /** @export */ js_create_input_device: _js_create_input_device, - /** @export */ js_open_process: _js_open_process, - /** @export */ js_process_status: _js_process_status, - /** @export */ js_waitpid: _js_waitpid, - /** @export */ makecontext: _makecontext, - /** @export */ proc_exit: _proc_exit, - /** @export */ strftime: _strftime, - /** @export */ strftime_l: _strftime_l, - /** @export */ strptime: _strptime, - /** @export */ swapcontext: _swapcontext, - /** @export */ wasm_close: _wasm_close, - /** @export */ wasm_setsockopt: _wasm_setsockopt, - /** @export */ wasm_shutdown: _wasm_shutdown -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["__wasm_call_ctors"])(); - -var _malloc = a0 => (_malloc = wasmExports["malloc"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["wasm_popen"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["wasm_php_exec"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["php_pollfd_for"])(a0, a1, a2); - -var _htons = a0 => (_htons = wasmExports["htons"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["ntohs"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["htonl"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["wasm_sleep"])(a0); - -var _fflush = a0 => (_fflush = wasmExports["fflush"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["wasm_read"])(a0, a1, a2); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["__wrap_select"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["wasm_add_cli_arg"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["run_cli"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["wasm_set_sapi_name"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["wasm_set_phpini_path"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["wasm_add_SERVER_entry"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["wasm_add_ENV_entry"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["wasm_set_query_string"])(a0); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + /** @type {function(...*):?} */ function _swapcontext() { + abort('missing function: swapcontext'); + } + + _swapcontext.stub = true; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + function _wasm_shutdown(socketd, how) { + return PHPWASM.shutdownSocket(socketd, how); + } + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + if (isAsyncifyImport) { + imports[x] = original = new WebAssembly.Suspending( + original + ); + } + } + } + }, + instrumentWasmExports(exports) { + var exportPattern = + /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; + Asyncify.asyncExports = new Set(); + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + let isAsyncifyExport = exportPattern.test(x); + if (isAsyncifyExport) { + Asyncify.asyncExports.add(original); + original = Asyncify.makeAsyncFunction(original); + } + ret[x] = (...args) => original(...args); + } else { + ret[x] = original; + } + } + return ret; + }, + asyncExports: null, + isAsyncExport(func) { + return Asyncify.asyncExports?.has(func); + }, + handleAsync: async (startAsync) => { + runtimeKeepalivePush(); + try { + return await startAsync(); + } finally { + runtimeKeepalivePop(); + } + }, + handleSleep(startAsync) { + return Asyncify.handleAsync(() => new Promise(startAsync)); + }, + makeAsyncFunction(original) { + return WebAssembly.promising(original); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + var stackSave = () => _emscripten_stack_get_current(); + + var stackRestore = (val) => __emscripten_stack_restore(val); + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func(...cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + if (asyncMode) return ret.then(onDone); + ret = onDone(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ SharpYuvConvert: _SharpYuvConvert, + /** @export */ SharpYuvGetConversionMatrix: + _SharpYuvGetConversionMatrix, + /** @export */ SharpYuvInit: _SharpYuvInit, + /** @export */ __assert_fail: ___assert_fail, + /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, + /** @export */ __asyncjs__js_module_onMessage: + __asyncjs__js_module_onMessage, + /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, + /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, + /** @export */ __call_sighandler: ___call_sighandler, + /** @export */ __syscall_accept4: ___syscall_accept4, + /** @export */ __syscall_bind: ___syscall_bind, + /** @export */ __syscall_chdir: ___syscall_chdir, + /** @export */ __syscall_chmod: ___syscall_chmod, + /** @export */ __syscall_connect: ___syscall_connect, + /** @export */ __syscall_dup: ___syscall_dup, + /** @export */ __syscall_dup3: ___syscall_dup3, + /** @export */ __syscall_faccessat: ___syscall_faccessat, + /** @export */ __syscall_fallocate: ___syscall_fallocate, + /** @export */ __syscall_fchmod: ___syscall_fchmod, + /** @export */ __syscall_fchown32: ___syscall_fchown32, + /** @export */ __syscall_fchownat: ___syscall_fchownat, + /** @export */ __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ __syscall_fdatasync: ___syscall_fdatasync, + /** @export */ __syscall_fstat64: ___syscall_fstat64, + /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, + /** @export */ __syscall_getcwd: ___syscall_getcwd, + /** @export */ __syscall_getdents64: ___syscall_getdents64, + /** @export */ __syscall_getpeername: ___syscall_getpeername, + /** @export */ __syscall_getsockname: ___syscall_getsockname, + /** @export */ __syscall_getsockopt: ___syscall_getsockopt, + /** @export */ __syscall_ioctl: ___syscall_ioctl, + /** @export */ __syscall_listen: ___syscall_listen, + /** @export */ __syscall_lstat64: ___syscall_lstat64, + /** @export */ __syscall_mkdirat: ___syscall_mkdirat, + /** @export */ __syscall_newfstatat: ___syscall_newfstatat, + /** @export */ __syscall_openat: ___syscall_openat, + /** @export */ __syscall_pipe: ___syscall_pipe, + /** @export */ __syscall_poll: ___syscall_poll, + /** @export */ __syscall_readlinkat: ___syscall_readlinkat, + /** @export */ __syscall_recvfrom: ___syscall_recvfrom, + /** @export */ __syscall_renameat: ___syscall_renameat, + /** @export */ __syscall_rmdir: ___syscall_rmdir, + /** @export */ __syscall_sendto: ___syscall_sendto, + /** @export */ __syscall_socket: ___syscall_socket, + /** @export */ __syscall_stat64: ___syscall_stat64, + /** @export */ __syscall_statfs64: ___syscall_statfs64, + /** @export */ __syscall_symlink: ___syscall_symlink, + /** @export */ __syscall_unlinkat: ___syscall_unlinkat, + /** @export */ __syscall_utimensat: ___syscall_utimensat, + /** @export */ _abort_js: __abort_js, + /** @export */ _emscripten_get_now_is_monotonic: + __emscripten_get_now_is_monotonic, + /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, + /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, + /** @export */ _emscripten_runtime_keepalive_clear: + __emscripten_runtime_keepalive_clear, + /** @export */ _gmtime_js: __gmtime_js, + /** @export */ _localtime_js: __localtime_js, + /** @export */ _mktime_js: __mktime_js, + /** @export */ _mmap_js: __mmap_js, + /** @export */ _munmap_js: __munmap_js, + /** @export */ _setitimer_js: __setitimer_js, + /** @export */ _tzset_js: __tzset_js, + /** @export */ emscripten_date_now: _emscripten_date_now, + /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, + /** @export */ emscripten_get_now: _emscripten_get_now, + /** @export */ emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ emscripten_sleep: _emscripten_sleep, + /** @export */ environ_get: _environ_get, + /** @export */ environ_sizes_get: _environ_sizes_get, + /** @export */ exit: _exit, + /** @export */ fd_close: _fd_close, + /** @export */ fd_fdstat_get: _fd_fdstat_get, + /** @export */ fd_read: _fd_read, + /** @export */ fd_seek: _fd_seek, + /** @export */ fd_sync: _fd_sync, + /** @export */ fd_write: _fd_write, + /** @export */ getaddrinfo: _getaddrinfo, + /** @export */ getcontext: _getcontext, + /** @export */ getdtablesize: _getdtablesize, + /** @export */ getnameinfo: _getnameinfo, + /** @export */ getprotobyname: _getprotobyname, + /** @export */ getprotobynumber: _getprotobynumber, + /** @export */ js_create_input_device: _js_create_input_device, + /** @export */ js_open_process: _js_open_process, + /** @export */ js_process_status: _js_process_status, + /** @export */ js_waitpid: _js_waitpid, + /** @export */ makecontext: _makecontext, + /** @export */ proc_exit: _proc_exit, + /** @export */ strftime: _strftime, + /** @export */ strftime_l: _strftime_l, + /** @export */ strptime: _strptime, + /** @export */ swapcontext: _swapcontext, + /** @export */ wasm_close: _wasm_close, + /** @export */ wasm_setsockopt: _wasm_setsockopt, + /** @export */ wasm_shutdown: _wasm_shutdown, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => + (___wasm_call_ctors = wasmExports['__wasm_call_ctors'])(); + + var _malloc = (a0) => (_malloc = wasmExports['malloc'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['wasm_popen'])( + a0, + a1 + )); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = + wasmExports['wasm_php_exec'])(a0, a1, a2, a3)); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = + wasmExports['php_pollfd_for'])(a0, a1, a2)); + + var _htons = (a0) => (_htons = wasmExports['htons'])(a0); + + var _ntohs = (a0) => (_ntohs = wasmExports['ntohs'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['htonl'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['wasm_sleep'])(a0)); + + var _fflush = (a0) => (_fflush = wasmExports['fflush'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['wasm_read'])( + a0, + a1, + a2 + )); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = + wasmExports['__wrap_select'])(a0, a1, a2, a3, a4)); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = + wasmExports['wasm_add_cli_arg'])(a0)); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['run_cli'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['wasm_set_sapi_name'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['wasm_set_phpini_path'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['wasm_add_SERVER_entry'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['wasm_add_ENV_entry'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['wasm_set_query_string'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['wasm_set_path_translated'])(a0)); -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["wasm_set_path_translated"])(a0); + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['wasm_set_skip_shebang'])(a0)); -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["wasm_set_skip_shebang"])(a0); + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['wasm_set_request_uri'])(a0)); -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["wasm_set_request_uri"])(a0); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['wasm_set_request_method'])(a0)); -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["wasm_set_request_method"])(a0); + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['wasm_set_request_host'])(a0)); -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["wasm_set_request_host"])(a0); + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['wasm_set_content_type'])(a0)); -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["wasm_set_content_type"])(a0); + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['wasm_set_request_body'])(a0)); -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["wasm_set_request_body"])(a0); + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['wasm_set_content_length'])(a0)); -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["wasm_set_content_length"])(a0); + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = + wasmExports['wasm_set_cookies'])(a0)); -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["wasm_set_cookies"])(a0); + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['wasm_set_request_port'])(a0)); -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["wasm_set_request_port"])(a0); + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['wasm_sapi_request_shutdown'])()); -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["wasm_sapi_request_shutdown"])(); - -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["wasm_sapi_handle_request"])(); - -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["php_wasm_init"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["wasm_free"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["__funcs_on_exit"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["emscripten_builtin_memalign"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["_emscripten_timeout"])(a0, a1); - -var ___trap = () => (___trap = wasmExports["__trap"])(); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["_emscripten_tempret_set"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"])(); - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['wasm_sapi_handle_request'])()); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = + wasmExports['php_wasm_init'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['wasm_free'])(a0)); + + var ___funcs_on_exit = () => + (___funcs_on_exit = wasmExports['__funcs_on_exit'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = + wasmExports['emscripten_builtin_memalign'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['_emscripten_timeout'])(a0, a1); + + var ___trap = () => (___trap = wasmExports['__trap'])(); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['_emscripten_tempret_set'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['_emscripten_stack_restore'])( + a0 + ); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = + wasmExports['emscripten_stack_get_current'])(); + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/node/jspi/php_8_3.js b/packages/php-wasm/node/jspi/php_8_3.js index 81b9f0676e..0d932851bb 100644 --- a/packages/php-wasm/node/jspi/php_8_3.js +++ b/packages/php-wasm/node/jspi/php_8_3.js @@ -1,6695 +1,7754 @@ -const dependencyFilename = __dirname + '/8_3_0/php_8_3.wasm'; -export { dependencyFilename }; -export const dependenciesTotalSize = 14909583; +const dependencyFilename = __dirname + '/8_3_0/php_8_3.wasm'; +export { dependencyFilename }; +export const dependenciesTotalSize = 14909583; export function init(RuntimeName, PHPLoader) { - /** - * Overrides Emscripten's default ExitStatus object which gets - * thrown on failure. Unfortunately, the default object is not - * a subclass of Error and does not provide any stack trace. - * - * This is a deliberate behavior on Emscripten's end to prevent - * memory leaks after the program exits. See: - * - * https://github.com/emscripten-core/emscripten/pull/9108 - * - * In case of WordPress Playground, the worker in which the PHP - * runs will typically exit after the PHP program finishes, so - * we don't have to worry about memory leaks. - * - * As for assigning to a previously undeclared ExitStatus variable here, - * the Emscripten module declares `ExitStatus` as `function ExitStatus` - * which means it gets hoisted to the top of the scope and can be - * reassigned here – before the actual declaration is reached. - * - * If that sounds weird, try this example: - * - * ExitStatus = () => { console.log("reassigned"); } - * function ExitStatus() {} - * ExitStatus(); - * // logs "reassigned" - */ - ExitStatus = class PHPExitStatus extends Error { - constructor(status) { - super(status); - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - } - - // The rest of the code comes from the built php.js file and esm-suffix.js -var Module = typeof PHPLoader != "undefined" ? PHPLoader : {}; - -var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER"; - -var ENVIRONMENT_IS_NODE=RuntimeName==="NODE"; - -if (ENVIRONMENT_IS_NODE) {} - -var moduleOverrides = Object.assign({}, Module); - -var arguments_ = []; - -var thisProgram = "./this.program"; - -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -var scriptDirectory = ""; - -function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; -} - -var read_, readAsync, readBinary; - -if (ENVIRONMENT_IS_NODE) { - var fs = require("fs"); - var nodePath = require("path"); - scriptDirectory = __dirname + "/"; - read_ = (filename, binary) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - return fs.readFileSync(filename, binary ? undefined : "utf8"); - }; - readBinary = filename => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; - }; - readAsync = (filename, onload, onerror, binary = true) => { - filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); - fs.readFile(filename, binary ? undefined : "utf8", (err, data) => { - if (err) onerror(err); else onload(binary ? data.buffer : data); - }); - }; - if (!Module["thisProgram"] && process.argv.length > 1) { - thisProgram = process.argv[1].replace(/\\/g, "/"); - } - arguments_ = process.argv.slice(2); - if (typeof module != "undefined") { - module["exports"] = Module; - } - quit_ = (status, toThrow) => { - process.exitCode = status; - throw toThrow; - }; -} else {} - -var out = Module["print"] || console.log.bind(console); - -var err = Module["printErr"] || console.error.bind(console); - -Object.assign(Module, moduleOverrides); - -moduleOverrides = null; - -if (Module["arguments"]) arguments_ = Module["arguments"]; - -if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - -if (Module["quit"]) quit_ = Module["quit"]; - -var wasmBinary; - -if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - -var wasmMemory; - -var ABORT = false; - -var EXITSTATUS; - -/** @type {function(*, string=)} */ function assert(condition, text) { - if (!condition) { - abort(text); - } -} - -var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; - -function updateMemoryViews() { - var b = wasmMemory.buffer; - Module["HEAP8"] = HEAP8 = new Int8Array(b); - Module["HEAP16"] = HEAP16 = new Int16Array(b); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); - Module["HEAP32"] = HEAP32 = new Int32Array(b); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); - Module["HEAPF32"] = HEAPF32 = new Float32Array(b); - Module["HEAPF64"] = HEAPF64 = new Float64Array(b); -} - -var __ATPRERUN__ = []; - -var __ATINIT__ = []; - -var __ATEXIT__ = []; - -var __ATPOSTRUN__ = []; - -var runtimeInitialized = false; - -var runtimeExited = false; - -function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; - TTY.init(); - PIPEFS.root = FS.mount(PIPEFS, {}, null); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - ___funcs_on_exit(); - callRuntimeCallbacks(__ATEXIT__); - FS.quit(); - TTY.shutdown(); - runtimeExited = true; -} - -function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -var runDependencies = 0; - -var runDependencyWatcher = null; - -var dependenciesFulfilled = null; - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); -} - -function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } -} - -/** @param {string|number=} what */ function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - EXITSTATUS = 1; - what += ". Build with -sASSERTIONS for more info."; - if (runtimeInitialized) { - ___trap(); - } - /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); - throw e; -} - -var dataURIPrefix = "data:application/octet-stream;base64,"; - -/** - * Indicates whether filename is a base64 data URI. - * @noinline - */ var isDataURI = filename => filename.startsWith(dataURIPrefix); - -/** - * Indicates whether filename is delivered via file protocol (as opposed to http/https) - * @noinline - */ var isFileURI = filename => filename.startsWith("file://"); - -function findWasmBinary() { - var f = dependencyFilename; - if (!isDataURI(f)) { - return locateFile(f); - } - return f; -} - -var wasmBinaryFile; - -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"; -} - -function getBinaryPromise(binaryFile) { - if (!wasmBinary) { - return new Promise((resolve, reject) => { - readAsync(binaryFile, response => resolve(new Uint8Array(/** @type{!ArrayBuffer} */ (response))), error => { - try { - resolve(getBinarySync(binaryFile)); - } catch (e) { - reject(e); - } - }); - }); - } - return Promise.resolve().then(() => getBinarySync(binaryFile)); -} - -function instantiateArrayBuffer(binaryFile, imports, receiver) { - return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { - err(`failed to asynchronously prepare wasm: ${reason}`); - abort(reason); - }); -} - -function instantiateAsync(binary, binaryFile, imports, callback) { - if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && !ENVIRONMENT_IS_NODE && typeof fetch == "function") { - return fetch(binaryFile, { - credentials: "same-origin" - }).then(response => { - /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); - return result.then(callback, function(reason) { - err(`wasm streaming compile failed: ${reason}`); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(binaryFile, imports, callback); - }); - }); - } - return instantiateArrayBuffer(binaryFile, imports, callback); -} - -function getWasmImports() { - Asyncify.instrumentWasmImports(wasmImports); - return { - "env": wasmImports, - "wasi_snapshot_preview1": wasmImports - }; -} - -function createWasm() { - var info = getWasmImports(); - /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmExports = Asyncify.instrumentWasmExports(wasmExports); - Module["wasmExports"] = wasmExports; - wasmMemory = wasmExports["memory"]; - updateMemoryViews(); - wasmTable = wasmExports["__indirect_function_table"]; - addOnInit(wasmExports["__wasm_call_ctors"]); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - function receiveInstantiationResult(result) { - receiveInstance(result["instance"]); - } - if (Module["instantiateWasm"]) { - try { - return Module["instantiateWasm"](info, receiveInstance); - } catch (e) { - err(`Module.instantiateWasm callback failed with error: ${e}`); - return false; - } - } - if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); - instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); - return {}; -} - -var tempDouble; - -var tempI64; - -function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (!command) return 1; - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) return 0; - const modestr = UTF8ToString(mode); - if (!modestr.length) return 0; - if (modestr === "w") { - console.error('popen($cmd, "w") is not implemented yet'); - } - return returnCallback(async wakeUp => { - let cp; - try { - cp = PHPWASM.spawnProcess(cmdstr, []); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - console.error(e); - if (e.code === "SPAWN_UNSUPPORTED") { - return 1; - } - throw e; - } - const outByteArrays = []; - cp.stdout.on("data", function(data) { - outByteArrays.push(data); - }); - const outputPath = "/tmp/popen_output"; - cp.on("exit", function(exitCode) { - const outBytes = new Uint8Array(outByteArrays.reduce((acc, curr) => acc + curr.length, 0)); - let offset = 0; - for (const byteArray of outByteArrays) { - outBytes.set(byteArray, offset); - offset += byteArray.length; - } - FS.writeFile(outputPath, outBytes); - HEAPU8[exitCodePtr] = exitCode; - wakeUp(allocateUTF8OnStack(outputPath)); - }); - }); - }); -} - -__asyncjs__js_popen_to_file.sig = "iiii"; - -function __asyncjs__wasm_poll_socket(socketd, events, timeout) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - const POLLIN = 1; - const POLLPRI = 2; - const POLLOUT = 4; - const POLLERR = 8; - const POLLHUP = 16; - const POLLNVAL = 32; - return returnCallback(wakeUp => { - const polls = []; - if (socketd in PHPWASM.child_proc_by_fd) { - const procInfo = PHPWASM.child_proc_by_fd[socketd]; - if (procInfo.exited) { - wakeUp(0); - return; - } - polls.push(PHPWASM.awaitEvent(procInfo.stdout, "data")); - } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { - const sock = getSocketFromFD(socketd); - if (!sock) { - wakeUp(0); - return; - } - const lookingFor = new Set; - if (events & POLLIN || events & POLLPRI) { - if (sock.server) { - for (const client of sock.pending) { - if ((client.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - } else if ((sock.recv_queue || []).length > 0) { - wakeUp(1); - return; - } - } - const webSockets = PHPWASM.getAllWebSockets(sock); - if (!webSockets.length) { - wakeUp(0); - return; - } - for (const ws of webSockets) { - if (events & POLLIN || events & POLLPRI) { - polls.push(PHPWASM.awaitData(ws)); - lookingFor.add("POLLIN"); - } - if (events & POLLOUT) { - polls.push(PHPWASM.awaitConnection(ws)); - lookingFor.add("POLLOUT"); - } - if (events & POLLHUP) { - polls.push(PHPWASM.awaitClose(ws)); - lookingFor.add("POLLHUP"); - } - if (events & POLLERR || events & POLLNVAL) { - polls.push(PHPWASM.awaitError(ws)); - lookingFor.add("POLLERR"); - } - } - } else { - setTimeout(function() { - wakeUp(1); - }, timeout); - return; - } - if (polls.length === 0) { - console.warn("Unsupported poll event " + events + ", defaulting to setTimeout()."); - setTimeout(function() { - wakeUp(0); - }, timeout); - return; - } - const promises = polls.map(([promise]) => promise); - const clearPolling = () => polls.forEach(([, clear]) => clear()); - let awaken = false; - let timeoutId; - Promise.race(promises).then(function(results) { - if (!awaken) { - awaken = true; - wakeUp(1); - if (timeoutId) { - clearTimeout(timeoutId); - } - clearPolling(); - } - }); - if (timeout !== -1) { - timeoutId = setTimeout(function() { - if (!awaken) { - awaken = true; - wakeUp(0); - clearPolling(); - } - }, timeout); - } - }); - }); -} - -__asyncjs__wasm_poll_socket.sig = "iiii"; - -function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { - return Asyncify.handleAsync(async () => { - const returnCallback = resolver => new Promise(resolver); - if (Asyncify?.State?.Normal === undefined || Asyncify?.state === Asyncify?.State?.Normal) { - var returnCode; - var stream; - let num = 0; - try { - stream = SYSCALLS.getStreamFromFD(fd); - const num = doReadv(stream, iov, iovcnt); - HEAPU32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - throw e; - } - if (e.errno !== 6 || !(stream?.fd in PHPWASM.child_proc_by_fd)) { - HEAPU32[pnum >> 2] = 0; - return returnCode; - } - } - } - return returnCallback(wakeUp => { - var retries = 0; - var interval = 50; - var timeout = 5e3; - var maxRetries = timeout / interval; - function poll() { - var returnCode; - var stream; - let num; - try { - stream = SYSCALLS.getStreamFromFD(fd); - num = doReadv(stream, iov, iovcnt); - returnCode = 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) { - console.error(e); - throw e; - } - returnCode = e.errno; - } - const success = returnCode === 0; - const failure = (++retries > maxRetries || !(fd in PHPWASM.child_proc_by_fd) || PHPWASM.child_proc_by_fd[fd]?.exited || FS.isClosed(stream)); - if (success) { - HEAPU32[pnum >> 2] = num; - wakeUp(0); - } else if (failure) { - HEAPU32[pnum >> 2] = 0; - wakeUp(returnCode === 6 ? 0 : returnCode); - } else { - setTimeout(poll, interval); - } - } - poll(); - }); - }); -} - -__asyncjs__js_fd_read.sig = "iiiii"; - -function __asyncjs__js_module_onMessage(data, response_buffer) { - return Asyncify.handleAsync(async () => { - if (Module["onMessage"]) { - const dataStr = UTF8ToString(data); - return Module["onMessage"](dataStr).then(response => { - const responseBytes = typeof response === "string" ? (new TextEncoder).encode(response) : response; - const responseSize = responseBytes.byteLength; - const responsePtr = _malloc(responseSize + 1); - HEAPU8.set(responseBytes, responsePtr); - HEAPU8[responsePtr + responseSize] = 0; - HEAPU8[response_buffer] = responsePtr; - HEAPU8[response_buffer + 1] = responsePtr >> 8; - HEAPU8[response_buffer + 2] = responsePtr >> 16; - HEAPU8[response_buffer + 3] = responsePtr >> 24; - return responseSize; - }).catch(e => { - console.error(e); - return -1; - }); - } - }); -} - -__asyncjs__js_module_onMessage.sig = "iii"; - -/** @constructor */ function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = `Program terminated with exit(${status})`; - this.status = status; -} - -var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } -}; - -var noExitRuntime = Module["noExitRuntime"] || false; - -/** @type {function(...*):?} */ function _SharpYuvConvert() { - abort("missing function: SharpYuvConvert"); -} - -_SharpYuvConvert.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { - abort("missing function: SharpYuvGetConversionMatrix"); -} - -_SharpYuvGetConversionMatrix.stub = true; - -/** @type {function(...*):?} */ function _SharpYuvInit() { - abort("missing function: SharpYuvInit"); -} - -_SharpYuvInit.stub = true; - -var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; - -/** - * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given - * array that contains uint8 values, returns a copy of that string as a - * Javascript String object. - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); - } - } - return str; -}; - -/** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index (i.e. maxBytesToRead will not - * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing - * frequent uses of UTF8ToString() with and without maxBytesToRead may throw - * JS JIT optimizations off, so it is worth to consider consistently using one - * @return {string} - */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - -Module["UTF8ToString"] = UTF8ToString; - -var ___assert_fail = (condition, filename, line, func) => { - abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); -}; - -var wasmTableMirror = []; - -/** @type {WebAssembly.Table} */ var wasmTable; - -var getWasmTableEntry = funcPtr => { - var func = wasmTableMirror[funcPtr]; - if (!func) { - if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; - wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); - if (Asyncify.isAsyncExport(func)) { - wasmTableMirror[funcPtr] = func = Asyncify.makeAsyncFunction(func); - } - } - return func; -}; - -var ___call_sighandler = (fp, sig) => getWasmTableEntry(fp)(sig); - -var initRandomFill = () => { - if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { - return view => crypto.getRandomValues(view); - } else if (ENVIRONMENT_IS_NODE) { - try { - var crypto_module = require("crypto"); - var randomFillSync = crypto_module["randomFillSync"]; - if (randomFillSync) { - return view => crypto_module["randomFillSync"](view); - } - var randomBytes = crypto_module["randomBytes"]; - return view => (view.set(randomBytes(view.byteLength)), view); - } catch (e) {} - } - abort("initRandomDevice"); -}; - -var randomFill = view => (randomFill = initRandomFill())(view); - -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.substr(-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.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: path => { - if (path === "/") return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, - join: (...paths) => PATH.normalize(paths.join("/")), - join2: (l, r) => PATH.normalize(l + "/" + r) -}; - -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).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (;start < arr.length; start++) { - if (arr[start] !== "") break; - } - var end = arr.length - 1; - for (;end >= 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 < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } -}; - -var FS_stdin_getChar_buffer = []; - -var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; -}; - -Module["lengthBytesUTF8"] = lengthBytesUTF8; - -var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | (u1 & 1023); - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | (u >> 6); - heap[outIdx++] = 128 | (u & 63); - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | (u >> 12); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | (u >> 18); - heap[outIdx++] = 128 | ((u >> 12) & 63); - heap[outIdx++] = 128 | ((u >> 6) & 63); - heap[outIdx++] = 128 | (u & 63); - } - } - heap[outIdx] = 0; - return outIdx - startIdx; -}; - -/** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - /** @suppress {missingProperties} */ var fd = process.stdin.fd; - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); - } catch (e) { - if (e.toString().includes("EOF")) bytesRead = 0; else throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } - } 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: 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) { - /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char(tty) { - return FS_stdin_getChar(); - }, - put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - 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, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, - fsync(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } -}; - -var zeroMemory = (address, size) => { - HEAPU8.fill(0, address, address + size); - return address; -}; - -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) return 0; - return zeroMemory(ptr, size); -}; - -var MEMFS = { - ops_table: null, - mount(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 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, - allocate: MEMFS.stream_ops.allocate, - 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 = null; - } 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.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - 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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup(parent, name) { - throw FS.genericErrors[44]; - }, - mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - }, - unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = 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.timestamp = Date.now(); - }, - readdir(node) { - var entries = [ ".", ".." ]; - for (var key of Object.keys(node.contents)) { - entries.push(key); - } - return entries; - }, - symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 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); - if (size > 8 && contents.subarray) { - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - 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.timestamp = Date.now(); - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; - } - } - 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; - }, - allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, - 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 { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { - ptr: ptr, - allocated: allocated - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { - var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; - readAsync(url, arrayBuffer => { - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, event => { - if (onerror) { - onerror(); - } else { - throw `Loading data file "${url}" failed.`; - } - }); - if (dep) addRunDependency(dep); -}; - -var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { - FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); -}; - -var preloadPlugins = Module["preloadPlugins"] || []; - -var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { - if (typeof Browser != "undefined") Browser.init(); - var handled = false; - preloadPlugins.forEach(plugin => { - if (handled) return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, onerror); - handled = true; - } - }); - return handled; -}; - -var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency(`cp ${fullname}`); - function processData(byteArray) { - function finish(byteArray) { - preFinish?.(); - if (!dontCreateFile) { - FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - onload?.(); - removeRunDependency(dep); - } - if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { - onerror?.(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == "string") { - asyncLoad(url, processData, onerror); - } else { - processData(url); - } -}; - -var FS_modeStringToFlags = 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_getMode = (canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; -}; - -var ERRNO_CODES = { - "EPERM": 63, - "ENOENT": 44, - "ESRCH": 71, - "EINTR": 27, - "EIO": 29, - "ENXIO": 60, - "E2BIG": 1, - "ENOEXEC": 45, - "EBADF": 8, - "ECHILD": 12, - "EAGAIN": 6, - "EWOULDBLOCK": 6, - "ENOMEM": 48, - "EACCES": 2, - "EFAULT": 21, - "ENOTBLK": 105, - "EBUSY": 10, - "EEXIST": 20, - "EXDEV": 75, - "ENODEV": 43, - "ENOTDIR": 54, - "EISDIR": 31, - "EINVAL": 28, - "ENFILE": 41, - "EMFILE": 33, - "ENOTTY": 59, - "ETXTBSY": 74, - "EFBIG": 22, - "ENOSPC": 51, - "ESPIPE": 70, - "EROFS": 69, - "EMLINK": 34, - "EPIPE": 64, - "EDOM": 18, - "ERANGE": 68, - "ENOMSG": 49, - "EIDRM": 24, - "ECHRNG": 106, - "EL2NSYNC": 156, - "EL3HLT": 107, - "EL3RST": 108, - "ELNRNG": 109, - "EUNATCH": 110, - "ENOCSI": 111, - "EL2HLT": 112, - "EDEADLK": 16, - "ENOLCK": 46, - "EBADE": 113, - "EBADR": 114, - "EXFULL": 115, - "ENOANO": 104, - "EBADRQC": 103, - "EBADSLT": 102, - "EDEADLOCK": 16, - "EBFONT": 101, - "ENOSTR": 100, - "ENODATA": 116, - "ETIME": 117, - "ENOSR": 118, - "ENONET": 119, - "ENOPKG": 120, - "EREMOTE": 121, - "ENOLINK": 47, - "EADV": 122, - "ESRMNT": 123, - "ECOMM": 124, - "EPROTO": 65, - "EMULTIHOP": 36, - "EDOTDOT": 125, - "EBADMSG": 9, - "ENOTUNIQ": 126, - "EBADFD": 127, - "EREMCHG": 128, - "ELIBACC": 129, - "ELIBBAD": 130, - "ELIBSCN": 131, - "ELIBMAX": 132, - "ELIBEXEC": 133, - "ENOSYS": 52, - "ENOTEMPTY": 55, - "ENAMETOOLONG": 37, - "ELOOP": 32, - "EOPNOTSUPP": 138, - "EPFNOSUPPORT": 139, - "ECONNRESET": 15, - "ENOBUFS": 42, - "EAFNOSUPPORT": 5, - "EPROTOTYPE": 67, - "ENOTSOCK": 57, - "ENOPROTOOPT": 50, - "ESHUTDOWN": 140, - "ECONNREFUSED": 14, - "EADDRINUSE": 3, - "ECONNABORTED": 13, - "ENETUNREACH": 40, - "ENETDOWN": 38, - "ETIMEDOUT": 73, - "EHOSTDOWN": 142, - "EHOSTUNREACH": 23, - "EINPROGRESS": 26, - "EALREADY": 7, - "EDESTADDRREQ": 17, - "EMSGSIZE": 35, - "EPROTONOSUPPORT": 66, - "ESOCKTNOSUPPORT": 137, - "EADDRNOTAVAIL": 4, - "ENETRESET": 39, - "EISCONN": 30, - "ENOTCONN": 53, - "ETOOMANYREFS": 141, - "EUSERS": 136, - "EDQUOT": 19, - "ESTALE": 72, - "ENOTSUP": 138, - "ENOMEDIUM": 148, - "EILSEQ": 25, - "EOVERFLOW": 61, - "ECANCELED": 11, - "ENOTRECOVERABLE": 56, - "EOWNERDEAD": 62, - "ESTRPIPE": 135 -}; - -var NODEFS = { - isWindows: false, - staticInit() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process.binding("constants"); - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"], - 131072: flags["O_NOFOLLOW"] - }; - }, - convertNodeCode(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - tryFSOperation(f) { - try { - return f(); - } catch (e) { - if (!e.code) throw e; - if (e.code === "UNKNOWN") throw new FS.ErrnoError(28); - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - mount(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode(path) { - var stat; - return NODEFS.tryFSOperation(() => { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode |= (stat.mode & 292) >> 2; - } - return stat.mode; - }); - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - flagsForNode(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - flags &= ~65536; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (flags) { - throw new FS.ErrnoError(28); - } - return newFlags; - }, - node_ops: { - getattr(node) { - var path = NODEFS.realPath(node); - var stat; - NODEFS.tryFSOperation(() => stat = fs.lstatSync(path)); - if (NODEFS.isWindows) { - if (!stat.blksize) { - stat.blksize = 4096; - } - if (!stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - stat.mode |= (stat.mode & 292) >> 2; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - }); - }, - lookup(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - NODEFS.tryFSOperation(() => { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { - mode: node.mode - }); - } - }); - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); - oldNode.name = newName; - }, - unlink(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.unlinkSync(path)); - }, - rmdir(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - NODEFS.tryFSOperation(() => fs.rmdirSync(path)); - }, - readdir(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readdirSync(path)); - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); - }, - readlink(node) { - var path = NODEFS.realPath(node); - return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); - } - }, - stream_ops: { - open(stream) { - var path = NODEFS.realPath(stream.node); - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode)) { - stream.shared.refcount = 1; - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - }); - }, - close(stream) { - NODEFS.tryFSOperation(() => { - if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) { - fs.closeSync(stream.nfd); - } - }); - }, - dup(stream) { - stream.shared.refcount++; - }, - read(stream, buffer, offset, length, position) { - if (length === 0) return 0; - return NODEFS.tryFSOperation(() => fs.readSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - write(stream, buffer, offset, length, position) { - return NODEFS.tryFSOperation(() => fs.writeSync(stream.nfd, new Int8Array(buffer.buffer, offset, length), 0, length, position)); - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - NODEFS.tryFSOperation(() => { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - }); - } - } - 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 = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { - ptr: ptr, - allocated: true - }; - }, - msync(stream, buffer, offset, length, mmapFlags) { - NODEFS.stream_ops.write(stream, buffer, 0, length, offset, false); - return 0; - } - } -}; - -var PROXYFS = { - mount(mount) { - return PROXYFS.createNode(null, "/", mount.opts.fs.lstat(mount.opts.root).mode, 0); - }, - createNode(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = PROXYFS.node_ops; - node.stream_ops = PROXYFS.stream_ops; - return node; - }, - realPath(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join(...parts); - }, - node_ops: { - getattr(node) { - var path = PROXYFS.realPath(node); - var stat; - try { - stat = node.mount.opts.fs.lstat(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr(node, attr) { - var path = PROXYFS.realPath(node); - try { - if (attr.mode !== undefined) { - node.mount.opts.fs.chmod(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - node.mount.opts.fs.utime(path, date, date); - } - if (attr.size !== undefined) { - node.mount.opts.fs.truncate(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - lookup(parent, name) { - try { - var path = PATH.join2(PROXYFS.realPath(parent), name); - var mode = parent.mount.opts.fs.lstat(path).mode; - var node = PROXYFS.createNode(parent, name, mode); - return node; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - mknod(parent, name, mode, dev) { - var node = PROXYFS.createNode(parent, name, mode, dev); - var path = PROXYFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - node.mount.opts.fs.mkdir(path, node.mode); - } else { - node.mount.opts.fs.writeFile(path, "", { - mode: node.mode - }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - }, - rename(oldNode, newDir, newName) { - var oldPath = PROXYFS.realPath(oldNode); - var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); - try { - oldNode.mount.opts.fs.rename(oldPath, newPath); - oldNode.name = newName; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - unlink(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.unlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - rmdir(parent, name) { - var path = PATH.join2(PROXYFS.realPath(parent), name); - try { - parent.mount.opts.fs.rmdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readdir(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readdir(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - symlink(parent, newName, oldPath) { - var newPath = PATH.join2(PROXYFS.realPath(parent), newName); - try { - parent.mount.opts.fs.symlink(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - readlink(node) { - var path = PROXYFS.realPath(node); - try { - return node.mount.opts.fs.readlink(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - }, - stream_ops: { - open(stream) { - var path = PROXYFS.realPath(stream.node); - try { - stream.nfd = stream.node.mount.opts.fs.open(path, stream.flags); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - close(stream) { - try { - stream.node.mount.opts.fs.close(stream.nfd); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - read(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.read(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - write(stream, buffer, offset, length, position) { - try { - return stream.node.mount.opts.fs.write(stream.nfd, buffer, offset, length, position); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }, - llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = stream.node.node_ops.getattr(stream.node); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - } - } -}; - -var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - ErrnoError: class { - constructor(errno) { - this.name = "ErrnoError"; - this.errno = errno; - } - }, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - FSStream: class { - constructor() { - this.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 { - constructor(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - this.readMode = 292 | /*292*/ 73; - /*73*/ this.writeMode = 146; - } - /*146*/ 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 = {}) { - path = PATH_FS.resolve(path); - if (!path) return { - path: "", - node: null - }; - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts); - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = path.split("/").filter(p => !!p); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length - 1); - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count + 1 - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { - path: current_path, - node: current - }; - }, - getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; - } - path = path ? `${node.name}/${path}` : node.name; - node = node.parent; - } - }, - hashName(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 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; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else 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) { - 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; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || (flags & 512)) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - 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; - }, - 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); - } - } - mounts.forEach(mount => { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - 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: type, - opts: opts, - mountpoint: 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); - Object.keys(FS.nameTable).forEach(hash => { - var current = FS.nameTable[hash]; - 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 || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - 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); - }, - create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */ mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */ mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += "/" + dirs[i]; - 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; - } - /* 0666 */ 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; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.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 PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, - stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat(path) { - return FS.stat(path, true); - }, - chmod(path, mode, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - }, - lchmod(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod(fd, mode) { - var stream = FS.getStreamChecked(fd); - FS.chmod(stream.node, mode); - }, - chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == "string") { - var lookup = FS.lookupPath(path, { - follow: !dontFollow - }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - }); - }, - lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown(fd, uid, gid) { - var stream = FS.getStreamChecked(fd); - FS.chown(stream.node, uid, gid); - }, - 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; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - 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); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, - ftruncate(fd, len) { - var stream = FS.getStreamChecked(fd); - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { - follow: true - }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, - open(path, flags, mode) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; - if ((flags & 64)) { - mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) {} - } - var created = false; - if ((flags & 64)) { - if (node) { - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 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: node, - path: FS.getPath(node), - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - 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; - }, - allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - 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); - } - 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") { - throw new Error(`Invalid encoding type "${opts.encoding}"`); - } - var ret; - 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") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - 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 - }); - 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) { - randomLeft = randomFill(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", 16384 | 511, /* 0777 */ 73); - 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 - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, {}, "/proc/self/fd"); - }, - createStandardStreams() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } 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() { - [ 44 ].forEach(code => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { - "MEMFS": MEMFS, - "NODEFS": NODEFS, - "PROXYFS": PROXYFS - }; - }, - init(input, output, error) { - FS.init.initialized = true; - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit() { - FS.init.initialized = false; - _fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - 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) {} - 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) { - if (typeof data == "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - 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); - if (!FS.createDevice.major) 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) { - /* ignored */ var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != "undefined") { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile(parent, name, url, canRead, canWrite) { - class LazyUint8Array { - constructor() { - this.lengthKnown = false; - this.chunks = []; - } - get(idx) { - if (idx > this.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)) throw new Error("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) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("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)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */ (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") throw new Error("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 (typeof XMLHttpRequest != "undefined") { - if (!ENVIRONMENT_IS_WORKER) throw "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: 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 = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(key => { - var fn = node.stream_ops[key]; - 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 < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents.get(position + i); - } - } - return size; - } - stream_ops.read = (stream, buffer, offset, length, position) => { - 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: ptr, - allocated: true - }; - }; - node.stream_ops = stream_ops; - return node; - } -}; - -Module["FS"] = FS; - -var SOCKFS = { - mount(mount) { - Module["websocket"] = (Module["websocket"] && ("object" === typeof Module["websocket"])) ? Module["websocket"] : {}; - Module["websocket"]._callbacks = {}; - Module["websocket"]["on"] = /** @this{Object} */ function(event, callback) { - if ("function" === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - Module["websocket"].emit = /** @this{Object} */ function(event, param) { - if ("function" === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createSocket(family, type, protocol) { - type &= ~526336; - var streaming = type == 1; - if (streaming && protocol && protocol != 6) { - throw new FS.ErrnoError(66); - } - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - var stream = FS.createStream({ - path: name, - node: node, - flags: 2, - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - sock.stream = stream; - return sock; - }, - getSocket(fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - }, - stream_ops: { - poll(stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - }, - ioctl(stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - }, - close(stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - } - }, - nextname() { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return "socket[" + (SOCKFS.nextname.current++) + "]"; - }, - websocket_sock_ops: { - createPeer(sock, addr, port) { - var ws; - if (typeof addr == "object") { - ws = addr; - addr = null; - port = null; - } - if (ws) { - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error("WebSocket URL must be in the format ws(s)://address:port"); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - try { - var runtimeConfig = (Module["websocket"] && ("object" === typeof Module["websocket"])); - var url = "ws:#".replace("#", "//"); - if (runtimeConfig) { - if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]) { - url = Module["websocket"]["url"]; - } - } - if (url === "ws://" || url === "wss://") { - var parts = addr.split("/"); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join("/"); - } - var subProtocols = "binary"; - if (runtimeConfig) { - if ("string" === typeof Module["websocket"]["subprotocol"]) { - subProtocols = Module["websocket"]["subprotocol"]; - } - } - var opts = undefined; - if (subProtocols !== "null") { - subProtocols = subProtocols.replace(/^ +| +$/g, "").split(/ *, */); - opts = subProtocols; - } - if (runtimeConfig && null === Module["websocket"]["subprotocol"]) { - subProtocols = "null"; - opts = undefined; - } - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = /** @type{(typeof WebSocket)} */ (require("ws")); - } else { - WebSocketConstructor = WebSocket; - } - if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url, opts); - ws.binaryType = "arraybuffer"; - } catch (e) { - throw new FS.ErrnoError(23); - } - } - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - if (sock.type === 2 && typeof sock.sport != "undefined") { - peer.dgram_send_queue.push(new Uint8Array([ 255, 255, 255, 255, "p".charCodeAt(0), "o".charCodeAt(0), "r".charCodeAt(0), "t".charCodeAt(0), ((sock.sport & 65280) >> 8), (sock.sport & 255) ])); - } - return peer; - }, - getPeer(sock, addr, port) { - return sock.peers[addr + ":" + port]; - }, - addPeer(sock, peer) { - sock.peers[peer.addr + ":" + peer.port] = peer; - }, - removePeer(sock, peer) { - delete sock.peers[peer.addr + ":" + peer.port]; - }, - handlePeerEvents(sock, peer) { - var first = true; - var handleOpen = function() { - Module["websocket"].emit("open", sock.stream.fd); - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - peer.socket.close(); - } - }; - function handleMessage(data) { - if (typeof data == "string") { - var encoder = new TextEncoder; - data = encoder.encode(data); - } else { - assert(data.byteLength !== undefined); - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); - } - var wasfirst = first; - first = false; - if (wasfirst && data.length === 10 && data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && data[4] === "p".charCodeAt(0) && data[5] === "o".charCodeAt(0) && data[6] === "r".charCodeAt(0) && data[7] === "t".charCodeAt(0)) { - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - sock.recv_queue.push({ - addr: peer.addr, - port: peer.port, - data: data - }); - Module["websocket"].emit("message", sock.stream.fd); - } - if (ENVIRONMENT_IS_NODE) { - peer.socket.on("open", handleOpen); - peer.socket.on("message", function(data, isBinary) { - if (!isBinary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); - }); - peer.socket.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - }); - peer.socket.on("error", function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module["websocket"].emit("close", sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - sock.error = 14; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "ECONNREFUSED: Connection refused" ]); - }; - } - }, - poll(sock) { - if (sock.type === 1 && sock.server) { - return sock.pending.length ? (64 | 1) : 0; - } - var mask = 0; - var dest = sock.type === 1 ? SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : null; - if (sock.recv_queue.length || !dest || (dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= (64 | 1); - } - if (!dest || (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - return mask; - }, - ioctl(sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg) >> 2)] = bytes; - return 0; - - default: - return 28; - } - }, - close(sock) { - if (sock.server) { - try { - sock.server.close(); - } catch (e) {} - sock.server = null; - } - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) {} - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - }, - bind(sock, addr, port) { - if (typeof sock.saddr != "undefined" || typeof sock.sport != "undefined") { - throw new FS.ErrnoError(28); - } - sock.saddr = addr; - sock.sport = port; - if (sock.type === 2) { - if (sock.server) { - sock.server.close(); - sock.server = null; - } - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e.name === "ErrnoError")) throw e; - if (e.errno !== 138) throw e; - } - } - }, - connect(sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(138); - } - if (typeof sock.daddr != "undefined" && typeof sock.dport != "undefined") { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(7); - } else { - throw new FS.ErrnoError(30); - } - } - } - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - throw new FS.ErrnoError(26); - }, - listen(sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(138); - } - if (sock.server) { - throw new FS.ErrnoError(28); - } - var WebSocketServer = require("ws").Server; - var host = sock.saddr; - if (Module['websocket']['serverDecorator']) {WebSocketServer = Module['websocket']['serverDecorator'](WebSocketServer);}sock.server = new WebSocketServer({ - host: host, - port: sock.sport - }); - Module["websocket"].emit("listen", sock.stream.fd); - sock.server.on("connection", function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - sock.pending.push(newsock); - Module["websocket"].emit("connection", newsock.stream.fd); - } else { - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module["websocket"].emit("connection", sock.stream.fd); - } - }); - sock.server.on("close", function() { - Module["websocket"].emit("close", sock.stream.fd); - sock.server = null; - }); - sock.server.on("error", function(error) { - sock.error = 23; - Module["websocket"].emit("error", [ sock.stream.fd, sock.error, "EHOSTUNREACH: Host is unreachable" ]); - }); - }, - accept(listensock) { - if (!listensock.server || !listensock.pending.length) { - throw new FS.ErrnoError(28); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - }, - getname(sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(53); - } - addr = sock.daddr; - port = sock.dport; - } else { - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { - addr: addr, - port: port - }; - }, - sendmsg(sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(17); - } - } else { - addr = sock.daddr; - port = sock.dport; - } - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(53); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(6); - } - } - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - var data; - data = buffer.slice(offset, offset + length); - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - try { - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(28); - } - }, - recvmsg(sock, length, flags) { - if (sock.type === 1 && sock.server) { - throw new FS.ErrnoError(53); - } - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (!dest) { - throw new FS.ErrnoError(53); - } - if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - return null; - } - throw new FS.ErrnoError(6); - } - throw new FS.ErrnoError(6); - } - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - if (flags&2) {bytesRead = 0;} if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - return res; - } - } -}; - -var getSocketFromFD = fd => { - var socket = SOCKFS.getSocket(fd); - if (!socket) throw new FS.ErrnoError(8); - return socket; -}; - -var inetPton4 = str => { - var b = str.split("."); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; -}; - -/** @suppress {checkTypes} */ var jstoi_q = str => parseInt(str); - -var inetPton6 = str => { - var words; - var w, offset, z; - /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [ 0, 0, 0, 0, 0, 0, 0, 0 ]; - } - if (str.startsWith("::")) { - str = str.replace("::", "Z:"); - } else { - str = str.replace("::", ":Z:"); - } - if (str.indexOf(".") > 0) { - str = str.replace(new RegExp("[.]", "g"), ":"); - words = str.split(":"); - words[words.length - 4] = jstoi_q(words[words.length - 4]) + jstoi_q(words[words.length - 3]) * 256; - words[words.length - 3] = jstoi_q(words[words.length - 2]) + jstoi_q(words[words.length - 1]) * 256; - words = words.slice(0, words.length - 2); - } else { - words = str.split(":"); - } - offset = 0; - z = 0; - for (w = 0; w < words.length; w++) { - if (typeof words[w] == "string") { - if (words[w] === "Z") { - for (z = 0; z < (8 - words.length + 1); z++) { - parts[w + z] = 0; - } - offset = z - 1; - } else { - parts[w + offset] = _htons(parseInt(words[w], 16)); - } - } else { - parts[w + offset] = words[w]; - } - } - return [ (parts[1] << 16) | parts[0], (parts[3] << 16) | parts[2], (parts[5] << 16) | parts[4], (parts[7] << 16) | parts[6] ]; -}; - -/** @param {number=} addrlen */ var writeSockaddr = (sa, family, addr, port, addrlen) => { - switch (family) { - case 2: - addr = inetPton4(addr); - zeroMemory(sa, 16); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 16; - } - HEAP16[((sa) >> 1)] = family; - HEAP32[(((sa) + (4)) >> 2)] = addr; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - case 10: - addr = inetPton6(addr); - zeroMemory(sa, 28); - if (addrlen) { - HEAP32[((addrlen) >> 2)] = 28; - } - HEAP32[((sa) >> 2)] = family; - HEAP32[(((sa) + (8)) >> 2)] = addr[0]; - HEAP32[(((sa) + (12)) >> 2)] = addr[1]; - HEAP32[(((sa) + (16)) >> 2)] = addr[2]; - HEAP32[(((sa) + (20)) >> 2)] = addr[3]; - HEAP16[(((sa) + (2)) >> 1)] = _htons(port); - break; - - default: - return 5; - } - return 0; -}; - -var DNS = { - address_map: { - id: 1, - addrs: {}, - names: {} - }, - lookup_name(name) { - var res = inetPton4(name); - if (res !== null) { - return name; - } - res = inetPton6(name); - if (res !== null) { - return name; - } - var addr; - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, "exceeded max address mappings of 65535"); - addr = "172.29." + (id & 255) + "." + (id & 65280); - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - return addr; - }, - lookup_addr(addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - return null; - } -}; - -function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { - try { - var sock = getSocketFromFD(fd); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen); - } - return newsock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var inetNtop4 = addr => (addr & 255) + "." + ((addr >> 8) & 255) + "." + ((addr >> 16) & 255) + "." + ((addr >> 24) & 255); - -var inetNtop6 = ints => { - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ ints[0] & 65535, (ints[0] >> 16), ints[1] & 65535, (ints[1] >> 16), ints[2] & 65535, (ints[2] >> 16), ints[3] & 65535, (ints[3] >> 16) ]; - var hasipv4 = true; - var v4part = ""; - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { - hasipv4 = false; - break; - } - } - if (hasipv4) { - v4part = inetNtop4(parts[6] | (parts[7] << 16)); - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - if (parts[5] === 0) { - str = "::"; - if (v4part === "0.0.0.0") v4part = ""; - if (v4part === "0.0.0.1") v4part = "1"; - str += v4part; - return str; - } - } - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - for (word = 0; word < 8; word++) { - if (longest > 1) { - if (parts[word] === 0 && word >= zstart && word < (zstart + longest)) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; - } - continue; - } - } - str += Number(_ntohs(parts[word] & 65535)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; -}; - -var readSockaddr = (sa, salen) => { - var family = HEAP16[((sa) >> 1)]; - var port = _ntohs(HEAPU16[(((sa) + (2)) >> 1)]); - var addr; - switch (family) { - case 2: - if (salen !== 16) { - return { - errno: 28 - }; - } - addr = HEAP32[(((sa) + (4)) >> 2)]; - addr = inetNtop4(addr); - break; - - case 10: - if (salen !== 28) { - return { - errno: 28 - }; - } - addr = [ HEAP32[(((sa) + (8)) >> 2)], HEAP32[(((sa) + (12)) >> 2)], HEAP32[(((sa) + (16)) >> 2)], HEAP32[(((sa) + (20)) >> 2)] ]; - addr = inetNtop6(addr); - break; - - default: - return { - errno: 5 - }; - } - return { - family: family, - addr: addr, - port: port - }; -}; - -/** @param {boolean=} allowNull */ var getSocketAddress = (addrp, addrlen, allowNull) => { - if (allowNull && addrp === 0) return null; - var info = readSockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; -}; - -function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var SYSCALLS = { - DEFAULT_POLLMASK: 5, - 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 PATH.join2(dir, path); - }, - doStat(func, path, buf) { - var stat = func(path); - HEAP32[((buf) >> 2)] = stat.dev; - HEAP32[(((buf) + (4)) >> 2)] = stat.mode; - HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; - HEAP32[(((buf) + (12)) >> 2)] = stat.uid; - HEAP32[(((buf) + (16)) >> 2)] = stat.gid; - HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; - (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); - HEAP32[(((buf) + (32)) >> 2)] = 4096; - HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; - var atime = stat.atime.getTime(); - var mtime = stat.mtime.getTime(); - var ctime = stat.ctime.getTime(); - (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3; - (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3; - (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); - HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3; - (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); - return 0; - }, - 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; - } -}; - -function ___syscall_chdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.chdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var info = getSocketAddress(addr, addrlen); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup(fd) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - return FS.dupStream(old).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_dup3(fd, newfd, flags) { - try { - var old = SYSCALLS.getStreamFromFD(fd); - if (old.fd === newfd) return -28; - var existing = FS.getStream(newfd); - if (existing) FS.close(existing); - return FS.dupStream(old, newfd).fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_faccessat(dirfd, path, amode, flags) { - 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 && /* otherwise, they've just passed F_OK */ FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - -function ___syscall_fallocate(fd, mode, offset_low, offset_high, len_low, len_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - var len = convertI32PairToI53Checked(len_low, len_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.allocate(stream, offset, len); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchmod(fd, mode) { - try { - FS.fchmod(fd, mode); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchown32(fd, owner, group) { - try { - FS.fchown(fd, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fchownat(dirfd, path, owner, group, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - flags = flags & (~256); - path = SYSCALLS.calculateAt(dirfd, path); - (nofollow ? FS.lchown : FS.chown)(path, owner, group); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -/** @suppress {duplicate } */ function syscallGetVarargI() { - var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; - SYSCALLS.varargs += 4; - return ret; -} - -var syscallGetVarargP = syscallGetVarargI; - -function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = syscallGetVarargI(); - if (arg < 0) { - return -28; - } - while (FS.streams[arg]) { - arg++; - } - var newStream; - newStream = FS.dupStream(stream, arg); - return newStream.fd; - } - - case 1: - case 2: - return 0; - - case 3: - return stream.flags; - - case 4: - { - var arg = syscallGetVarargI(); - stream.flags |= arg; - return 0; - } - - case 12: - { - var arg = syscallGetVarargP(); - var offset = 0; - HEAP16[(((arg) + (offset)) >> 1)] = 2; - return 0; - } - - case 13: - case 14: - return 0; - } - return -28; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fdatasync(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ftruncate64(fd, length_low, length_high) { - var length = convertI32PairToI53Checked(length_low, length_high); - try { - if (isNaN(length)) return 61; - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - -Module["stringToUTF8"] = stringToUTF8; - -function ___syscall_getcwd(buf, size) { - try { - if (size === 0) return -28; - var cwd = FS.cwd(); - var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; - if (size < cwdLengthInBytes) return -68; - stringToUTF8(cwd, buf, size); - return cwdLengthInBytes; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getdents64(fd, dirp, count) { - 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 idx = Math.floor(off / struct_size); - while (idx < stream.getdents.length && pos + struct_size <= count) { - var id; - var type; - var name = stream.getdents[idx]; - if (name === ".") { - id = stream.node.id; - type = 4; - } else if (name === "..") { - var lookup = FS.lookupPath(stream.path, { - parent: true - }); - id = lookup.node.id; - type = 4; - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8; - } - (tempI64 = [ id >>> 0, (tempDouble = id, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((dirp + pos) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (4)) >> 2)] = tempI64[1]); - (tempI64 = [ (idx + 1) * struct_size >>> 0, (tempDouble = (idx + 1) * struct_size, - (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((dirp + pos) + (8)) >> 2)] = tempI64[0], HEAP32[(((dirp + pos) + (12)) >> 2)] = tempI64[1]); - HEAP16[(((dirp + pos) + (16)) >> 1)] = 280; - HEAP8[(dirp + pos) + (18)] = type; - stringToUTF8(name, dirp + pos + 19, 256); - pos += struct_size; - idx += 1; - } - FS.llseek(stream, idx * struct_size, 0); - return pos; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - if (!sock.daddr) { - return -53; - } - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { - try { - var sock = getSocketFromFD(fd); - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || "0.0.0.0"), sock.sport, addrlen); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { - try { - var sock = getSocketFromFD(fd); - if (level === 1) { - if (optname === 4) { - HEAP32[((optval) >> 2)] = sock.error; - HEAP32[((optlen) >> 2)] = 4; - sock.error = null; - return 0; - } - } - return -50; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_ioctl(fd, op, varargs) { - 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)] = termios.c_iflag || 0; - HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; - HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; - HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; - for (var i = 0; i < 32; i++) { - HEAP8[(argp + i) + (17)] = 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)]; - var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; - var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; - var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; - var c_cc = []; - for (var i = 0; i < 32; i++) { - c_cc.push(HEAP8[(argp + i) + (17)]); - } - return stream.tty.ops.ioctl_tcsets(stream.tty, op, { - c_iflag: c_iflag, - c_oflag: c_oflag, - c_cflag: c_cflag, - c_lflag: c_lflag, - c_cc: c_cc - }); - } - return 0; - } - - case 21519: - { - if (!stream.tty) return -59; - var argp = syscallGetVarargP(); - HEAP32[((argp) >> 2)] = 0; - return 0; - } - - case 21520: - { - if (!stream.tty) return -59; - return -28; - } - - 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)] = winsize[0]; - HEAP16[(((argp) + (2)) >> 1)] = 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_listen(fd, backlog) { - try { - var sock = getSocketFromFD(fd); - sock.sock_ops.listen(sock, backlog); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_lstat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.lstat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_mkdirat(dirfd, path, mode) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - path = PATH.normalize(path); - if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_newfstatat(dirfd, path, buf, flags) { - try { - path = SYSCALLS.getStr(path); - var nofollow = flags & 256; - var allowEmpty = flags & 4096; - flags = flags & (~6400); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_openat(dirfd, path, flags, varargs) { - 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 PIPEFS = { - BUCKET_BUFFER_SIZE: 8192, - mount(mount) { - return FS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); - }, - createPipe() { - var pipe = { - buckets: [], - refcnt: 2 - }; - pipe.buckets.push({ - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }); - var rName = PIPEFS.nextname(); - var wName = PIPEFS.nextname(); - var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); - var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); - rNode.pipe = pipe; - wNode.pipe = pipe; - var readableStream = FS.createStream({ - path: rName, - node: rNode, - flags: 0, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - rNode.stream = readableStream; - var writableStream = FS.createStream({ - path: wName, - node: wNode, - flags: 1, - seekable: false, - stream_ops: PIPEFS.stream_ops - }); - wNode.stream = writableStream; - return { - readable_fd: readableStream.fd, - writable_fd: writableStream.fd - }; - }, - stream_ops: { - poll(stream) { - var pipe = stream.node.pipe; - if ((stream.flags & 2097155) === 1) { - return (256 | 4); - } - if (pipe.buckets.length > 0) { - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - if (bucket.offset - bucket.roffset > 0) { - return (64 | 1); - } - } - } - return 0; - }, - ioctl(stream, request, varargs) { - return 28; - }, - fsync(stream) { - return 28; - }, - read(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var currentLength = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var bucket = pipe.buckets[i]; - currentLength += bucket.offset - bucket.roffset; - } - var data = buffer.subarray(offset, offset + length); - if (length <= 0) { - return 0; - } - if (currentLength == 0) { - throw new FS.ErrnoError(6); - } - var toRead = Math.min(currentLength, length); - var totalRead = toRead; - var toRemove = 0; - for (var i = 0; i < pipe.buckets.length; i++) { - var currBucket = pipe.buckets[i]; - var bucketSize = currBucket.offset - currBucket.roffset; - if (toRead <= bucketSize) { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - if (toRead < bucketSize) { - tmpSlice = tmpSlice.subarray(0, toRead); - currBucket.roffset += toRead; - } else { - toRemove++; - } - data.set(tmpSlice); - break; - } else { - var tmpSlice = currBucket.buffer.subarray(currBucket.roffset, currBucket.offset); - data.set(tmpSlice); - data = data.subarray(tmpSlice.byteLength); - toRead -= tmpSlice.byteLength; - toRemove++; - } - } - if (toRemove && toRemove == pipe.buckets.length) { - toRemove--; - pipe.buckets[toRemove].offset = 0; - pipe.buckets[toRemove].roffset = 0; - } - pipe.buckets.splice(0, toRemove); - return totalRead; - }, - write(stream, buffer, offset, length, position) { - /* ignored */ var pipe = stream.node.pipe; - var data = buffer.subarray(offset, offset + length); - var dataLen = data.byteLength; - if (dataLen <= 0) { - return 0; - } - var currBucket = null; - if (pipe.buckets.length == 0) { - currBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: 0, - roffset: 0 - }; - pipe.buckets.push(currBucket); - } else { - currBucket = pipe.buckets[pipe.buckets.length - 1]; - } - assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); - var freeBytesInCurrBuffer = PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; - if (freeBytesInCurrBuffer >= dataLen) { - currBucket.buffer.set(data, currBucket.offset); - currBucket.offset += dataLen; - return dataLen; - } else if (freeBytesInCurrBuffer > 0) { - currBucket.buffer.set(data.subarray(0, freeBytesInCurrBuffer), currBucket.offset); - currBucket.offset += freeBytesInCurrBuffer; - data = data.subarray(freeBytesInCurrBuffer, data.byteLength); - } - var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; - var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; - for (var i = 0; i < numBuckets; i++) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: PIPEFS.BUCKET_BUFFER_SIZE, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE)); - data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength); - } - if (remElements > 0) { - var newBucket = { - buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), - offset: data.byteLength, - roffset: 0 - }; - pipe.buckets.push(newBucket); - newBucket.buffer.set(data); - } - return dataLen; - }, - close(stream) { - var pipe = stream.node.pipe; - pipe.refcnt--; - if (pipe.refcnt === 0) { - pipe.buckets = null; - } - } - }, - nextname() { - if (!PIPEFS.nextname.current) { - PIPEFS.nextname.current = 0; - } - return "pipe[" + (PIPEFS.nextname.current++) + "]"; - } -}; - -function ___syscall_pipe(fdPtr) { - try { - if (fdPtr == 0) { - throw new FS.ErrnoError(21); - } - var res = PIPEFS.createPipe(); - HEAP32[((fdPtr) >> 2)] = res.readable_fd; - HEAP32[(((fdPtr) + (4)) >> 2)] = res.writable_fd; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_poll(fds, nfds, timeout) { - try { - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd) >> 2)]; - var events = HEAP16[(((pollfd) + (4)) >> 1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops?.poll) { - mask = stream.stream_ops.poll(stream, -1); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd) + (6)) >> 1)] = mask; - } - return nonzero; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_readlinkat(dirfd, path, buf, bufsize) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { - try { - var sock = getSocketFromFD(fd); - var msg = sock.sock_ops.recvmsg(sock, len, typeof flags !== "undefined" ? flags : 0); - if (!msg) return 0; - if (addr) { - var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { - try { - oldpath = SYSCALLS.getStr(oldpath); - newpath = SYSCALLS.getStr(newpath); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { - try { - var sock = getSocketFromFD(fd); - var dest = getSocketAddress(addr, addr_len, true); - if (!dest) { - return FS.write(sock.stream, HEAP8, message, length); - } - return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_socket(domain, type, protocol) { - try { - var sock = SOCKFS.createSocket(domain, type, protocol); - return sock.stream.fd; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_statfs64(path, size, buf) { - try { - path = SYSCALLS.getStr(path); - HEAP32[(((buf) + (4)) >> 2)] = 4096; - HEAP32[(((buf) + (40)) >> 2)] = 4096; - HEAP32[(((buf) + (8)) >> 2)] = 1e6; - HEAP32[(((buf) + (12)) >> 2)] = 5e5; - HEAP32[(((buf) + (16)) >> 2)] = 5e5; - HEAP32[(((buf) + (20)) >> 2)] = FS.nextInode; - HEAP32[(((buf) + (24)) >> 2)] = 1e6; - HEAP32[(((buf) + (28)) >> 2)] = 42; - HEAP32[(((buf) + (44)) >> 2)] = 2; - HEAP32[(((buf) + (36)) >> 2)] = 255; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_symlink(target, linkpath) { - try { - target = SYSCALLS.getStr(target); - linkpath = SYSCALLS.getStr(linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -function ___syscall_unlinkat(dirfd, path, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort("Invalid flags passed to unlinkat"); - } - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var readI53FromI64 = ptr => HEAPU32[((ptr) >> 2)] + HEAP32[(((ptr) + (4)) >> 2)] * 4294967296; - -function ___syscall_utimensat(dirfd, path, times, flags) { - try { - path = SYSCALLS.getStr(path); - path = SYSCALLS.calculateAt(dirfd, path, true); - if (!times) { - var atime = Date.now(); - var mtime = atime; - } else { - var seconds = readI53FromI64(times); - var nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - atime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - times += 16; - seconds = readI53FromI64(times); - nanoseconds = HEAP32[(((times) + (8)) >> 2)]; - mtime = (seconds * 1e3) + (nanoseconds / (1e3 * 1e3)); - } - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return -e.errno; - } -} - -var __abort_js = () => { - abort(""); -}; - -var nowIsMonotonic = 1; - -var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; - -var __emscripten_lookup_name = name => { - var nameString = UTF8ToString(name); - return inetPton4(DNS.lookup_name(nameString)); -}; - -var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - -var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; -}; - -function __gmtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getUTCSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getUTCMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getUTCHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getUTCDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getUTCMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getUTCFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; -} - -var isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - -var MONTH_DAYS_LEAP_CUMULATIVE = [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; - -var MONTH_DAYS_REGULAR_CUMULATIVE = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; - -var ydayFromDate = date => { - var leap = isLeapYear(date.getFullYear()); - var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); - var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; - return yday; -}; - -function __localtime_js(time_low, time_high, tmPtr) { - var time = convertI32PairToI53Checked(time_low, time_high); - var date = new Date(time * 1e3); - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getFullYear() - 1900; - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[(((tmPtr) + (36)) >> 2)] = -(date.getTimezoneOffset() * 60); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; - HEAP32[(((tmPtr) + (32)) >> 2)] = dst; -} - -/** @suppress {duplicate } */ var setTempRet0 = val => __emscripten_tempret_set(val); - -var __mktime_js = function(tmPtr) { - var ret = (() => { - var date = new Date(HEAP32[(((tmPtr) + (20)) >> 2)] + 1900, HEAP32[(((tmPtr) + (16)) >> 2)], HEAP32[(((tmPtr) + (12)) >> 2)], HEAP32[(((tmPtr) + (8)) >> 2)], HEAP32[(((tmPtr) + (4)) >> 2)], HEAP32[((tmPtr) >> 2)], 0); - var dst = HEAP32[(((tmPtr) + (32)) >> 2)]; - var guessedOffset = date.getTimezoneOffset(); - var start = new Date(date.getFullYear(), 0, 1); - var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); - var winterOffset = start.getTimezoneOffset(); - var dstOffset = Math.min(winterOffset, summerOffset); - if (dst < 0) { - HEAP32[(((tmPtr) + (32)) >> 2)] = Number(summerOffset != winterOffset && dstOffset == guessedOffset); - } else if ((dst > 0) != (dstOffset == guessedOffset)) { - var nonDstOffset = Math.max(winterOffset, summerOffset); - var trueOffset = dst > 0 ? dstOffset : nonDstOffset; - date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4); - } - HEAP32[(((tmPtr) + (24)) >> 2)] = date.getDay(); - var yday = ydayFromDate(date) | 0; - HEAP32[(((tmPtr) + (28)) >> 2)] = yday; - HEAP32[((tmPtr) >> 2)] = date.getSeconds(); - HEAP32[(((tmPtr) + (4)) >> 2)] = date.getMinutes(); - HEAP32[(((tmPtr) + (8)) >> 2)] = date.getHours(); - HEAP32[(((tmPtr) + (12)) >> 2)] = date.getDate(); - HEAP32[(((tmPtr) + (16)) >> 2)] = date.getMonth(); - HEAP32[(((tmPtr) + (20)) >> 2)] = date.getYear(); - var timeMs = date.getTime(); - if (isNaN(timeMs)) { - return -1; - } - return timeMs / 1e3; - })(); - return (setTempRet0((tempDouble = ret, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0)), - ret >>> 0); -}; - -function __mmap_js(len, prot, flags, fd, offset_low, offset_high, allocated, addr) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - var res = FS.mmap(stream, len, offset, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated) >> 2)] = res.allocated; - HEAPU32[((addr) >> 2)] = 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_low, offset_high) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - 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 runtimeKeepaliveCounter = 0; - -var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - -var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -}; - -/** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { - EXITSTATUS = status; - if (!keepRuntimeAlive()) { - exitRuntime(); - } - _proc_exit(status); -}; - -var _exit = exitJS; - -Module["_exit"] = _exit; - -var maybeExit = () => { - if (runtimeExited) { - return; - } - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } -}; - -var callUserCallback = func => { - if (runtimeExited || ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } -}; - -var _emscripten_get_now; - -_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: id, - timeout_ms: timeout_ms - }; - return 0; -}; - -var __tzset_js = (timezone, daylight, std_name, dst_name) => { - var currentYear = (new Date).getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; - HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); - var extractZone = date => date.toLocaleTimeString(undefined, { - hour12: false, - timeZoneName: "short" - }).split(" ")[1]; - var winterName = extractZone(winter); - var summerName = extractZone(summer); - if (summerOffset < winterOffset) { - stringToUTF8(winterName, std_name, 17); - stringToUTF8(summerName, dst_name, 17); - } else { - stringToUTF8(winterName, dst_name, 17); - stringToUTF8(summerName, std_name, 17); - } -}; - -var _emscripten_date_now = () => Date.now(); - -var getHeapMax = () => 2147483648; - -var _emscripten_get_heap_max = () => getHeapMax(); - -var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } /*success*/ catch (e) {} -}; - -var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; -}; - -var runtimeKeepalivePush = () => { - runtimeKeepaliveCounter += 1; -}; - -var runtimeKeepalivePop = () => { - runtimeKeepaliveCounter -= 1; -}; - -/** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { - runtimeKeepalivePush(); - return setTimeout(() => { - runtimeKeepalivePop(); - callUserCallback(func); - }, timeout); -}; - -var _emscripten_sleep = ms => Asyncify.handleSleep(wakeUp => safeSetTimeout(wakeUp, ms)); - -Module["_emscripten_sleep"] = _emscripten_sleep; - -_emscripten_sleep.isAsync = true; - -var ENV = PHPLoader.ENV || {}; - -var getExecutableName = () => thisProgram || "./this.program"; - -var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "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; -}; - -var stringToAscii = (str, buffer) => { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer++] = str.charCodeAt(i); - } - HEAP8[buffer] = 0; -}; - -var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - getEnvStrings().forEach((string, i) => { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; - stringToAscii(string, ptr); - bufSize += string.length + 1; - }); - return 0; -}; - -var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[((penviron_count) >> 2)] = strings.length; - var bufSize = 0; - strings.forEach(string => bufSize += string.length + 1); - HEAPU32[((penviron_buf_size) >> 2)] = 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; - } -} - -function _fd_fdstat_get(fd, pbuf) { - try { - var rightsBase = 0; - var rightsInheriting = 0; - var flags = 0; - { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - } - HEAP8[pbuf] = type; - HEAP16[(((pbuf) + (2)) >> 1)] = flags; - (tempI64 = [ rightsBase >>> 0, (tempDouble = rightsBase, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (8)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (12)) >> 2)] = tempI64[1]); - (tempI64 = [ rightsInheriting >>> 0, (tempDouble = rightsInheriting, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[(((pbuf) + (16)) >> 2)] = tempI64[0], HEAP32[(((pbuf) + (20)) >> 2)] = tempI64[1]); - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - var offset = convertI32PairToI53Checked(offset_low, offset_high); - try { - if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd); - FS.llseek(stream, offset, whence); - (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], - HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); - 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 _fd_sync = function(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return Asyncify.handleSleep(wakeUp => { - var mount = stream.node.mount; - if (!mount.type.syncfs) { - wakeUp(0); - return; - } - mount.type.syncfs(mount, false, err => { - if (err) { - wakeUp(29); - return; - } - wakeUp(0); - }); - }); - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -}; - -_fd_sync.isAsync = true; - -/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[((iov) >> 2)]; - var len = HEAPU32[(((iov) + (4)) >> 2)]; - iov += 8; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (typeof offset != "undefined") { - offset += curr; - } - } - return ret; -}; - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doWritev(stream, iov, iovcnt); - HEAPU32[((pnum) >> 2)] = num; - return 0; - } catch (e) { - if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; - return e.errno; - } -} - -var _getaddrinfo = (node, service, hint, out) => { - var addr = 0; - var port = 0; - var flags = 0; - var family = 0; - var type = 0; - var proto = 0; - var ai; - function allocaddrinfo(family, type, proto, canon, addr, port) { - var sa, salen, ai; - var errno; - salen = family === 10 ? 28 : 16; - addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); - sa = _malloc(salen); - errno = writeSockaddr(sa, family, addr, port); - assert(!errno); - ai = _malloc(32); - HEAP32[(((ai) + (4)) >> 2)] = family; - HEAP32[(((ai) + (8)) >> 2)] = type; - HEAP32[(((ai) + (12)) >> 2)] = proto; - HEAPU32[(((ai) + (24)) >> 2)] = canon; - HEAPU32[(((ai) + (20)) >> 2)] = sa; - if (family === 10) { - HEAP32[(((ai) + (16)) >> 2)] = 28; - } else { - HEAP32[(((ai) + (16)) >> 2)] = 16; - } - HEAP32[(((ai) + (28)) >> 2)] = 0; - return ai; - } - if (hint) { - flags = HEAP32[((hint) >> 2)]; - family = HEAP32[(((hint) + (4)) >> 2)]; - type = HEAP32[(((hint) + (8)) >> 2)]; - proto = HEAP32[(((hint) + (12)) >> 2)]; - } - if (type && !proto) { - proto = type === 2 ? 17 : 6; - } - if (!type && proto) { - type = proto === 17 ? 2 : 1; - } - if (proto === 0) { - proto = 6; - } - if (type === 0) { - type = 1; - } - if (!node && !service) { - return -2; - } - if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { - return -1; - } - if (hint !== 0 && (HEAP32[((hint) >> 2)] & 2) && !node) { - return -1; - } - if (flags & 32) { - return -2; - } - if (type !== 0 && type !== 1 && type !== 2) { - return -7; - } - if (family !== 0 && family !== 2 && family !== 10) { - return -6; - } - if (service) { - service = UTF8ToString(service); - port = parseInt(service, 10); - if (isNaN(port)) { - if (flags & 1024) { - return -2; - } - return -8; - } - } - if (!node) { - if (family === 0) { - family = 2; - } - if ((flags & 1) === 0) { - if (family === 2) { - addr = _htonl(2130706433); - } else { - addr = [ 0, 0, 0, 1 ]; - } - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - node = UTF8ToString(node); - addr = inetPton4(node); - if (addr !== null) { - if (family === 0 || family === 2) { - family = 2; - } else if (family === 10 && (flags & 8)) { - addr = [ 0, 0, _htonl(65535), addr ]; - family = 10; - } else { - return -2; - } - } else { - addr = inetPton6(node); - if (addr !== null) { - if (family === 0 || family === 10) { - family = 10; - } else { - return -2; - } - } - } - if (addr != null) { - ai = allocaddrinfo(family, type, proto, node, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; - } - if (flags & 4) { - return -2; - } - node = DNS.lookup_name(node); - addr = inetPton4(node); - if (family === 0) { - family = 2; - } else if (family === 10) { - addr = [ 0, 0, _htonl(65535), addr ]; - } - ai = allocaddrinfo(family, type, proto, null, addr, port); - HEAPU32[((out) >> 2)] = ai; - return 0; -}; - -/** @type {function(...*):?} */ function _getcontext() { - abort("missing function: getcontext"); -} - -_getcontext.stub = true; - -/** @type {function(...*):?} */ function _getdtablesize() { - abort("missing function: getdtablesize"); -} - -_getdtablesize.stub = true; - -var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { - var info = readSockaddr(sa, salen); - if (info.errno) { - return -6; - } - var port = info.port; - var addr = info.addr; - var overflowed = false; - if (node && nodelen) { - var lookup; - if ((flags & 1) || !(lookup = DNS.lookup_addr(addr))) { - if (flags & 8) { - return -2; - } - } else { - addr = lookup; - } - var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); - if (numBytesWrittenExclNull + 1 >= nodelen) { - overflowed = true; - } - } - if (serv && servlen) { - port = "" + port; - var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); - if (numBytesWrittenExclNull + 1 >= servlen) { - overflowed = true; - } - } - if (overflowed) { - return -12; - } - return 0; -}; - -var Protocols = { - list: [], - map: {} -}; - -var _setprotoent = stayopen => { - function allocprotoent(name, proto, aliases) { - var nameBuf = _malloc(name.length + 1); - stringToAscii(name, nameBuf); - var j = 0; - var length = aliases.length; - var aliasListBuf = _malloc((length + 1) * 4); - for (var i = 0; i < length; i++, j += 4) { - var alias = aliases[i]; - var aliasBuf = _malloc(alias.length + 1); - stringToAscii(alias, aliasBuf); - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = aliasBuf; - } - HEAPU32[(((aliasListBuf) + (j)) >> 2)] = 0; - var pe = _malloc(12); - HEAPU32[((pe) >> 2)] = nameBuf; - HEAPU32[(((pe) + (4)) >> 2)] = aliasListBuf; - HEAP32[(((pe) + (8)) >> 2)] = proto; - return pe; - } - var list = Protocols.list; - var map = Protocols.map; - if (list.length === 0) { - var entry = allocprotoent("tcp", 6, [ "TCP" ]); - list.push(entry); - map["tcp"] = map["6"] = entry; - entry = allocprotoent("udp", 17, [ "UDP" ]); - list.push(entry); - map["udp"] = map["17"] = entry; - } - _setprotoent.index = 0; -}; - -var _getprotobyname = name => { - name = UTF8ToString(name); - _setprotoent(true); - var result = Protocols.map[name]; - return result; -}; - -var _getprotobynumber = number => { - _setprotoent(true); - var result = Protocols.map[number]; - return result; -}; - -var stackAlloc = sz => __emscripten_stack_alloc(sz); - -/** @suppress {duplicate } */ var stringToUTF8OnStack = str => { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8(str, ret, size); - return ret; -}; - -var allocateUTF8OnStack = stringToUTF8OnStack; - -var PHPWASM = { - init: function() { - FS.mkdir("/internal"); - FS.mkdir("/internal/shared"); - FS.mkdir("/internal/shared/preload"); - PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE ? require("events").EventEmitter : class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(eventName, data) { - if (this.listeners[eventName]) { - this.listeners[eventName].forEach(callback => { - callback(data); - }); - } - } - once(eventName, callback) { - const self = this; - function removedCallback() { - callback(...arguments); - self.removeListener(eventName, removedCallback); - } - this.on(eventName, removedCallback); - } - removeAllListeners(eventName) { - if (eventName) { - delete this.listeners[eventName]; - } else { - this.listeners = {}; - } - } - removeListener(eventName, callback) { - if (this.listeners[eventName]) { - const idx = this.listeners[eventName].indexOf(callback); - if (idx !== -1) { - this.listeners[eventName].splice(idx, 1); - } - } - } - }; - PHPWASM.child_proc_by_fd = {}; - PHPWASM.child_proc_by_pid = {}; - PHPWASM.input_devices = {}; - }, - getAllWebSockets: function(sock) { - const webSockets = new Set; - if (sock.server) { - sock.server.clients.forEach(ws => { - webSockets.add(ws); - }); - } - for (const peer of PHPWASM.getAllPeers(sock)) { - webSockets.add(peer.socket); - } - return Array.from(webSockets); - }, - getAllPeers: function(sock) { - const peers = new Set; - if (sock.server) { - sock.pending.filter(pending => pending.peers).forEach(pending => { - for (const peer of Object.values(pending.peers)) { - peers.add(peer); - } - }); - } - if (sock.peers) { - for (const peer of Object.values(sock.peers)) { - peers.add(peer); - } - } - return Array.from(peers); - }, - awaitData: function(ws) { - return PHPWASM.awaitEvent(ws, "message"); - }, - awaitConnection: function(ws) { - if (ws.OPEN === ws.readyState) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "open"); - }, - awaitClose: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "close"); - }, - awaitError: function(ws) { - if ([ ws.CLOSING, ws.CLOSED ].includes(ws.readyState)) { - return [ Promise.resolve(), PHPWASM.noop ]; - } - return PHPWASM.awaitEvent(ws, "error"); - }, - awaitEvent: function(ws, event) { - let resolve; - const listener = () => { - resolve(); - }; - const promise = new Promise(function(_resolve) { - resolve = _resolve; - ws.once(event, listener); - }); - const cancel = () => { - ws.removeListener(event, listener); - setTimeout(resolve); - }; - return [ promise, cancel ]; - }, - noop: function() {}, - spawnProcess: function(command, args, options) { - if (Module["spawnProcess"]) { - const spawnedPromise = Module["spawnProcess"](command, args, options); - return Promise.resolve(spawnedPromise).then(function(spawned) { - if (!spawned || !spawned.on) { - throw new Error("spawnProcess() must return an EventEmitter but returned a different type."); - } - return spawned; - }); - } - if (ENVIRONMENT_IS_NODE) { - return require("child_process").spawn(command, args, { - ...options, - shell: true, - stdio: [ "pipe", "pipe", "pipe" ], - timeout: 100 - }); - } - const e = new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() " + "and provide a callback to handle spawning processes, or disable a popen(), proc_open() " + "and similar functions via php.ini."); - e.code = "SPAWN_UNSUPPORTED"; - throw e; - }, - shutdownSocket: function(socketd, how) { - const sock = getSocketFromFD(socketd); - const peer = Object.values(sock.peers)[0]; - if (!peer) { - return -1; - } - try { - peer.socket.close(); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - return 0; - } catch (e) { - console.log("Socket shutdown error", e); - return -1; - } - } -}; - -function _js_create_input_device(deviceId) { - let dataBuffer = []; - let dataCallback; - const filename = "proc_id_" + deviceId; - const device = FS.createDevice("/dev", filename, function() {}, function(byte) { - try { - dataBuffer.push(byte); - if (dataCallback) { - dataCallback(new Uint8Array(dataBuffer)); - dataBuffer = []; - } - } catch (e) { - console.error(e); - throw e; - } - }); - const devicePath = "/dev/" + filename; - PHPWASM.input_devices[deviceId] = { - devicePath: devicePath, - onData: function(cb) { - dataCallback = cb; - dataBuffer.forEach(function(data) { - cb(data); - }); - dataBuffer.length = 0; - } - }; - return allocateUTF8OnStack(devicePath); -} - -function _js_open_process(command, argsPtr, argsLength, descriptorsPtr, descriptorsLength, cwdPtr, cwdLength, envPtr, envLength) { - if (!command) { - return 1; - } - const cmdstr = UTF8ToString(command); - if (!cmdstr.length) { - return 0; - } - let argsArray = []; - if (argsLength) { - for (var i = 0; i < argsLength; i++) { - const charPointer = argsPtr + i * 4; - argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); - } - } - const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; - let envObject = null; - if (envLength) { - envObject = {}; - for (var i = 0; i < envLength; i++) { - const envPointer = envPtr + i * 4; - const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); - const splitAt = envEntry.indexOf("="); - if (splitAt === -1) { - continue; - } - const key = envEntry.substring(0, splitAt); - const value = envEntry.substring(splitAt + 1); - envObject[key] = value; - } - } - var std = {}; - for (var i = 0; i < descriptorsLength; i++) { - const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; - std[HEAPU32[descriptorPtr >> 2]] = { - child: HEAPU32[(descriptorPtr + 4) >> 2], - parent: HEAPU32[(descriptorPtr + 8) >> 2] - }; - } - return Asyncify.handleSleep(async wakeUp => { - let cp; - try { - const options = {}; - if (cwdstr !== null) { - options.cwd = cwdstr; - } - if (envObject !== null) { - options.env = envObject; - } - cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); - if (cp instanceof Promise) { - cp = await cp; - } - } catch (e) { - if (e.code === "SPAWN_UNSUPPORTED") { - wakeUp(1); - return; - } - console.error(e); - wakeUp(1); - throw e; - } - const ProcInfo = { - pid: cp.pid, - exited: false, - stdinFd: std[0]?.child, - stdinIsDevice: std[0]?.child in PHPWASM.input_devices, - stdoutChildFd: std[1]?.child, - stdoutParentFd: std[1]?.parent, - stderrChildFd: std[2]?.child, - stderrParentFd: std[2]?.parent, - stdout: new PHPWASM.EventEmitter, - stderr: new PHPWASM.EventEmitter - }; - if (ProcInfo.stdoutChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; - if (ProcInfo.stderrChildFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; - if (ProcInfo.stdoutParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; - if (ProcInfo.stderrParentFd) PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; - PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; - cp.on("exit", function(code) { - ProcInfo.exitCode = code; - ProcInfo.exited = true; - ProcInfo.stdout.emit("data"); - ProcInfo.stderr.emit("data"); - }); - if (ProcInfo.stdoutChildFd) { - const stdoutStream = SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd); - let stdoutAt = 0; - cp.stdout.on("data", function(data) { - ProcInfo.stdout.emit("data", data); - stdoutStream.stream_ops.write(stdoutStream, data, 0, data.length, stdoutAt); - stdoutAt += data.length; - }); - } - if (ProcInfo.stderrChildFd) { - const stderrStream = SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd); - let stderrAt = 0; - cp.stderr.on("data", function(data) { - ProcInfo.stderr.emit("data", data); - stderrStream.stream_ops.write(stderrStream, data, 0, data.length, stderrAt); - stderrAt += data.length; - }); - } - /** - * Wait until the child process has been spawned. - * Unfortunately there is no Node.js API to check whether - * the process has already been spawned. We can only listen - * to the 'spawn' event and if it has already been spawned, - * listen to the 'exit' event. - */ try { - await new Promise((resolve, reject) => { - cp.on("spawn", resolve); - cp.on("error", reject); - }); - } catch (e) { - console.error(e); - wakeUp(1); - return; - } - if (ProcInfo.stdinIsDevice) { - PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data) { - if (!data) return; - if (typeof data === "number") { - data = new Uint8Array([ data ]); - } - const dataStr = new TextDecoder("utf-8").decode(data); - cp.stdin.write(dataStr); - }); - wakeUp(ProcInfo.pid); - return; - } - if (ProcInfo.stdinFd) { - const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); - if (stdinStream.node) { - const CHUNK_SIZE = 1024; - const buffer = new Uint8Array(CHUNK_SIZE); - let offset = 0; - while (true) { - const bytesRead = stdinStream.stream_ops.read(stdinStream, buffer, 0, CHUNK_SIZE, offset); - if (bytesRead === null || bytesRead === 0) { - break; - } - try { - cp.stdin.write(buffer.subarray(0, bytesRead)); - } catch (e) { - console.error(e); - return 1; - } - if (bytesRead < CHUNK_SIZE) { - break; - } - offset += bytesRead; - } - wakeUp(ProcInfo.pid); - return; - } - } - wakeUp(ProcInfo.pid); - }); -} - -function _js_process_status(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - if (PHPWASM.child_proc_by_pid[pid].exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - return 1; - } - return 0; -} - -function _js_waitpid(pid, exitCodePtr) { - if (!PHPWASM.child_proc_by_pid[pid]) { - return -1; - } - return Asyncify.handleSleep(wakeUp => { - const poll = function() { - if (PHPWASM.child_proc_by_pid[pid]?.exited) { - HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; - wakeUp(pid); - } else { - setTimeout(poll, 50); - } - }; - poll(); - }); -} - -/** @type {function(...*):?} */ function _makecontext() { - abort("missing function: makecontext"); -} - -_makecontext.stub = true; - -var arraySum = (array, index) => { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) {} - return sum; -}; - -var MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; - -var addDays = (date, days) => { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; - if (days > daysInCurrentMonth - newDate.getDate()) { - days -= (daysInCurrentMonth - newDate.getDate() + 1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth + 1); - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear() + 1); - } - } else { - newDate.setDate(newDate.getDate() + days); - return newDate; - } - } - return newDate; -}; - -var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); -}; - -var _strftime = (s, maxsize, format, tm) => { - var tm_zone = HEAPU32[(((tm) + (40)) >> 2)]; - var date = { - tm_sec: HEAP32[((tm) >> 2)], - tm_min: HEAP32[(((tm) + (4)) >> 2)], - tm_hour: HEAP32[(((tm) + (8)) >> 2)], - tm_mday: HEAP32[(((tm) + (12)) >> 2)], - tm_mon: HEAP32[(((tm) + (16)) >> 2)], - tm_year: HEAP32[(((tm) + (20)) >> 2)], - tm_wday: HEAP32[(((tm) + (24)) >> 2)], - tm_yday: HEAP32[(((tm) + (28)) >> 2)], - tm_isdst: HEAP32[(((tm) + (32)) >> 2)], - tm_gmtoff: HEAP32[(((tm) + (36)) >> 2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" - }; - var pattern = UTF8ToString(format); - var EXPANSION_RULES_1 = { - "%c": "%a %b %d %H:%M:%S %Y", - "%D": "%m/%d/%y", - "%F": "%Y-%m-%d", - "%h": "%b", - "%r": "%I:%M:%S %p", - "%R": "%H:%M", - "%T": "%H:%M:%S", - "%x": "%m/%d/%y", - "%X": "%H:%M:%S", - "%Ec": "%c", - "%EC": "%C", - "%Ex": "%m/%d/%y", - "%EX": "%H:%M:%S", - "%Ey": "%y", - "%EY": "%Y", - "%Od": "%d", - "%Oe": "%e", - "%OH": "%H", - "%OI": "%I", - "%Om": "%m", - "%OM": "%M", - "%OS": "%S", - "%Ou": "%u", - "%OU": "%U", - "%OV": "%V", - "%Ow": "%w", - "%OW": "%W", - "%Oy": "%y" - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); - } - var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - function leadingSomething(value, digits, character) { - var str = typeof value == "number" ? value.toString() : (value || ""); - while (str.length < digits) { - str = character[0] + str; - } - return str; - } - function leadingNulls(value, digits) { - return leadingSomething(value, digits, "0"); - } - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - var compare; - if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { - compare = sgn(date1.getDate() - date2.getDate()); - } - } - return compare; - } - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: - return new Date(janFourth.getFullYear() - 1, 11, 29); - - case 1: - return janFourth; - - case 2: - return new Date(janFourth.getFullYear(), 0, 3); - - case 3: - return new Date(janFourth.getFullYear(), 0, 2); - - case 4: - return new Date(janFourth.getFullYear(), 0, 1); - - case 5: - return new Date(janFourth.getFullYear() - 1, 11, 31); - - case 6: - return new Date(janFourth.getFullYear() - 1, 11, 30); - } - } - function getWeekBasedYear(date) { - var thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear() + 1; - } - return thisDate.getFullYear(); - } - return thisDate.getFullYear() - 1; - } - var EXPANSION_RULES_2 = { - "%a": date => WEEKDAYS[date.tm_wday].substring(0, 3), - "%A": date => WEEKDAYS[date.tm_wday], - "%b": date => MONTHS[date.tm_mon].substring(0, 3), - "%B": date => MONTHS[date.tm_mon], - "%C": date => { - var year = date.tm_year + 1900; - return leadingNulls((year / 100) | 0, 2); - }, - "%d": date => leadingNulls(date.tm_mday, 2), - "%e": date => leadingSomething(date.tm_mday, 2, " "), - "%g": date => getWeekBasedYear(date).toString().substring(2), - "%G": getWeekBasedYear, - "%H": date => leadingNulls(date.tm_hour, 2), - "%I": date => { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - "%j": date => leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon - 1), 3), - "%m": date => leadingNulls(date.tm_mon + 1, 2), - "%M": date => leadingNulls(date.tm_min, 2), - "%n": () => "\n", - "%p": date => { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return "AM"; - } - return "PM"; - }, - "%S": date => leadingNulls(date.tm_sec, 2), - "%t": () => "\t", - "%u": date => date.tm_wday || 7, - "%U": date => { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - "%V": date => { - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7) / 7); - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year % 400 - 1))) { - val++; - } - } else if (val == 53) { - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1; - } - return leadingNulls(val, 2); - }, - "%w": date => date.tm_wday, - "%W": date => { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - "%y": date => (date.tm_year + 1900).toString().substring(2), - "%Y": date => date.tm_year + 1900, - "%z": date => { - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - off = (off / 60) * 100 + (off % 60); - return (ahead ? "+" : "-") + String("0000" + off).slice(-4); - }, - "%Z": date => date.tm_zone, - "%%": () => "%" - }; - pattern = pattern.replace(/%%/g, "\0\0"); - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, "%"); - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - writeArrayToMemory(bytes, s); - return bytes.length - 1; -}; - -var _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm); - -var _strptime = (buf, format, tm) => { - var pattern = UTF8ToString(format); - var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,."; - for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { - pattern = pattern.replace(new RegExp("\\" + SPECIAL_CHARS[i], "g"), "\\" + SPECIAL_CHARS[i]); - } - var EQUIVALENT_MATCHERS = { - "A": "%a", - "B": "%b", - "c": "%a %b %d %H:%M:%S %Y", - "D": "%m\\/%d\\/%y", - "e": "%d", - "F": "%Y-%m-%d", - "h": "%b", - "R": "%H\\:%M", - "r": "%I\\:%M\\:%S\\s%p", - "T": "%H\\:%M\\:%S", - "x": "%m\\/%d\\/(?:%y|%Y)", - "X": "%H\\:%M\\:%S" - }; - var DATE_PATTERNS = { - /* weekday name */ "a": "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)", - /* month name */ "b": "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)", - /* century */ "C": "\\d\\d", - /* day of month */ "d": "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31", - /* hour (24hr) */ "H": "\\d(?!\\d)|[0,1]\\d|20|21|22|23", - /* hour (12hr) */ "I": "\\d(?!\\d)|0\\d|10|11|12", - /* day of year */ "j": "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d", - /* month */ "m": "0[1-9]|[1-9](?!\\d)|10|11|12", - /* minutes */ "M": "0\\d|\\d(?!\\d)|[1-5]\\d", - /* whitespace */ "n": " ", - /* AM/PM */ "p": "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.", - /* seconds */ "S": "0\\d|\\d(?!\\d)|[1-5]\\d|60", - /* week number */ "U": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* week number */ "W": "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53", - /* weekday number */ "w": "[0-6]", - /* 2-digit year */ "y": "\\d\\d", - /* 4-digit year */ "Y": "\\d\\d\\d\\d", - /* whitespace */ "t": " ", - /* time zone */ "z": "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)" - }; - var MONTH_NUMBERS = { - JAN: 0, - FEB: 1, - MAR: 2, - APR: 3, - MAY: 4, - JUN: 5, - JUL: 6, - AUG: 7, - SEP: 8, - OCT: 9, - NOV: 10, - DEC: 11 - }; - var DAY_NUMBERS_SUN_FIRST = { - SUN: 0, - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6 - }; - var DAY_NUMBERS_MON_FIRST = { - MON: 0, - TUE: 1, - WED: 2, - THU: 3, - FRI: 4, - SAT: 5, - SUN: 6 - }; - var capture = []; - var pattern_out = pattern.replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m).replace(/%(.)/g, (_, c) => { - let pat = DATE_PATTERNS[c]; - if (pat) { - capture.push(c); - return `(${pat})`; - } else { - return c; - } - }).replace(/\s+/g, "\\s*"); - var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf)); - function initDate() { - function fixup(value, min, max) { - return (typeof value != "number" || isNaN(value)) ? min : (value >= min ? (value <= max ? value : max) : min); - } - return { - year: fixup(HEAP32[(((tm) + (20)) >> 2)] + 1900, 1970, 9999), - month: fixup(HEAP32[(((tm) + (16)) >> 2)], 0, 11), - day: fixup(HEAP32[(((tm) + (12)) >> 2)], 1, 31), - hour: fixup(HEAP32[(((tm) + (8)) >> 2)], 0, 23), - min: fixup(HEAP32[(((tm) + (4)) >> 2)], 0, 59), - sec: fixup(HEAP32[((tm) >> 2)], 0, 59), - gmtoff: 0 - }; - } - if (matches) { - var date = initDate(); - var value; - var getMatch = symbol => { - var pos = capture.indexOf(symbol); - if (pos >= 0) { - return matches[pos + 1]; - } - return; - }; - if ((value = getMatch("S"))) { - date.sec = jstoi_q(value); - } - if ((value = getMatch("M"))) { - date.min = jstoi_q(value); - } - if ((value = getMatch("H"))) { - date.hour = jstoi_q(value); - } else if ((value = getMatch("I"))) { - var hour = jstoi_q(value); - if ((value = getMatch("p"))) { - hour += value.toUpperCase()[0] === "P" ? 12 : 0; - } - date.hour = hour; - } - if ((value = getMatch("Y"))) { - date.year = jstoi_q(value); - } else if ((value = getMatch("y"))) { - var year = jstoi_q(value); - if ((value = getMatch("C"))) { - year += jstoi_q(value) * 100; - } else { - year += year < 69 ? 2e3 : 1900; - } - date.year = year; - } - if ((value = getMatch("m"))) { - date.month = jstoi_q(value) - 1; - } else if ((value = getMatch("b"))) { - date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; - } - if ((value = getMatch("d"))) { - date.day = jstoi_q(value); - } else if ((value = getMatch("j"))) { - var day = jstoi_q(value); - var leapYear = isLeapYear(date.year); - for (var month = 0; month < 12; ++month) { - var daysUntilMonth = arraySum(leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, month - 1); - if (day <= daysUntilMonth + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]) { - date.day = day - daysUntilMonth; - } - } - } else if ((value = getMatch("a"))) { - var weekDay = value.substring(0, 3).toUpperCase(); - if ((value = getMatch("U"))) { - var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 0) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } else if ((value = getMatch("W"))) { - var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; - var weekNumber = jstoi_q(value); - var janFirst = new Date(date.year, 0, 1); - var endDate; - if (janFirst.getDay() === 1) { - endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1)); - } else { - endDate = addDays(janFirst, 7 - janFirst.getDay() + 1 + weekDayNumber + 7 * (weekNumber - 1)); - } - date.day = endDate.getDate(); - date.month = endDate.getMonth(); - } - } - if ((value = getMatch("z"))) { - if (value.toLowerCase() === "z") { - date.gmtoff = 0; - } else { - var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); - date.gmtoff = match[1] * 3600; - if (match[2]) { - date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; - } - } - } - /* + /** + * Overrides Emscripten's default ExitStatus object which gets + * thrown on failure. Unfortunately, the default object is not + * a subclass of Error and does not provide any stack trace. + * + * This is a deliberate behavior on Emscripten's end to prevent + * memory leaks after the program exits. See: + * + * https://github.com/emscripten-core/emscripten/pull/9108 + * + * In case of WordPress Playground, the worker in which the PHP + * runs will typically exit after the PHP program finishes, so + * we don't have to worry about memory leaks. + * + * As for assigning to a previously undeclared ExitStatus variable here, + * the Emscripten module declares `ExitStatus` as `function ExitStatus` + * which means it gets hoisted to the top of the scope and can be + * reassigned here – before the actual declaration is reached. + * + * If that sounds weird, try this example: + * + * ExitStatus = () => { console.log("reassigned"); } + * function ExitStatus() {} + * ExitStatus(); + * // logs "reassigned" + */ + ExitStatus = class PHPExitStatus extends Error { + constructor(status) { + super(status); + this.name = 'ExitStatus'; + this.message = 'Program terminated with exit(' + status + ')'; + this.status = status; + } + }; + + // The rest of the code comes from the built php.js file and esm-suffix.js + var Module = typeof PHPLoader != 'undefined' ? PHPLoader : {}; + + var ENVIRONMENT_IS_WORKER = RuntimeName === 'WORKER'; + + var ENVIRONMENT_IS_NODE = RuntimeName === 'NODE'; + + if (ENVIRONMENT_IS_NODE) { + } + + var moduleOverrides = Object.assign({}, Module); + + var arguments_ = []; + + var thisProgram = './this.program'; + + var quit_ = (status, toThrow) => { + throw toThrow; + }; + + var scriptDirectory = ''; + + function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; + } + + var read_, readAsync, readBinary; + + if (ENVIRONMENT_IS_NODE) { + var fs = require('fs'); + var nodePath = require('path'); + scriptDirectory = __dirname + '/'; + read_ = (filename, binary) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) + ? new URL(filename) + : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + arguments_ = process.argv.slice(2); + if (typeof module != 'undefined') { + module['exports'] = Module; + } + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else { + } + + var out = Module['print'] || console.log.bind(console); + + var err = Module['printErr'] || console.error.bind(console); + + Object.assign(Module, moduleOverrides); + + moduleOverrides = null; + + if (Module['arguments']) arguments_ = Module['arguments']; + + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + if (Module['quit']) quit_ = Module['quit']; + + var wasmBinary; + + if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + + var wasmMemory; + + var ABORT = false; + + var EXITSTATUS; + + /** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + abort(text); + } + } + + var /** @type {!Int8Array} */ HEAP8, + /** @type {!Uint8Array} */ HEAPU8, + /** @type {!Int16Array} */ HEAP16, + /** @type {!Uint16Array} */ HEAPU16, + /** @type {!Int32Array} */ HEAP32, + /** @type {!Uint32Array} */ HEAPU32, + /** @type {!Float32Array} */ HEAPF32, + /** @type {!Float64Array} */ HEAPF64; + + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); + } + + var __ATPRERUN__ = []; + + var __ATINIT__ = []; + + var __ATEXIT__ = []; + + var __ATPOSTRUN__ = []; + + var runtimeInitialized = false; + + var runtimeExited = false; + + function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') + Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + + function initRuntime() { + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); + if (!Module['noFSInit'] && !FS.init.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + PIPEFS.root = FS.mount(PIPEFS, {}, null); + callRuntimeCallbacks(__ATINIT__); + } + + function exitRuntime() { + ___funcs_on_exit(); + callRuntimeCallbacks(__ATEXIT__); + FS.quit(); + TTY.shutdown(); + runtimeExited = true; + } + + function postRun() { + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') + Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + + var runDependencies = 0; + + var runDependencyWatcher = null; + + var dependenciesFulfilled = null; + + function getUniqueRunDependency(id) { + return id; + } + + function addRunDependency(id) { + runDependencies++; + Module['monitorRunDependencies']?.(runDependencies); + } + + function removeRunDependency(id) { + runDependencies--; + Module['monitorRunDependencies']?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + + /** @param {string|number=} what */ function abort(what) { + Module['onAbort']?.(what); + what = 'Aborted(' + what + ')'; + err(what); + ABORT = true; + EXITSTATUS = 1; + what += '. Build with -sASSERTIONS for more info.'; + if (runtimeInitialized) { + ___trap(); + } + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError( + what + ); + throw e; + } + + var dataURIPrefix = 'data:application/octet-stream;base64,'; + + /** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + + /** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ var isFileURI = (filename) => filename.startsWith('file://'); + + function findWasmBinary() { + var f = dependencyFilename; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + + var wasmBinaryFile; + + 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'; + } + + function getBinaryPromise(binaryFile) { + if (!wasmBinary) { + return new Promise((resolve, reject) => { + readAsync( + binaryFile, + (response) => + resolve( + new Uint8Array( + /** @type{!ArrayBuffer} */ (response) + ) + ), + (error) => { + try { + resolve(getBinarySync(binaryFile)); + } catch (e) { + reject(e); + } + } + ); + }); + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile) + .then((binary) => WebAssembly.instantiate(binary, imports)) + .then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); + } + + function instantiateAsync(binary, binaryFile, imports, callback) { + if ( + !binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function' + ) { + return fetch(binaryFile, { + credentials: 'same-origin', + }).then((response) => { + /** @suppress {checkTypes} */ var result = + WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function (reason) { + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer( + binaryFile, + imports, + callback + ); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + + function getWasmImports() { + Asyncify.instrumentWasmImports(wasmImports); + return { + env: wasmImports, + wasi_snapshot_preview1: wasmImports, + }; + } + + function createWasm() { + var info = getWasmImports(); + /** @param {WebAssembly.Module=} module*/ function receiveInstance( + instance, + module + ) { + wasmExports = instance.exports; + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + Module['wasmExports'] = wasmExports; + wasmMemory = wasmExports['memory']; + updateMemoryViews(); + wasmTable = wasmExports['__indirect_function_table']; + addOnInit(wasmExports['__wasm_call_ctors']); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + function receiveInstantiationResult(result) { + receiveInstance(result['instance']); + } + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync( + wasmBinary, + wasmBinaryFile, + info, + receiveInstantiationResult + ); + return {}; + } + + var tempDouble; + + var tempI64; + + function __asyncjs__js_popen_to_file(command, mode, exitCodePtr) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if (!command) return 1; + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; + const modestr = UTF8ToString(mode); + if (!modestr.length) return 0; + if (modestr === 'w') { + console.error('popen($cmd, "w") is not implemented yet'); + } + return returnCallback(async (wakeUp) => { + let cp; + try { + cp = PHPWASM.spawnProcess(cmdstr, []); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + console.error(e); + if (e.code === 'SPAWN_UNSUPPORTED') { + return 1; + } + throw e; + } + const outByteArrays = []; + cp.stdout.on('data', function (data) { + outByteArrays.push(data); + }); + const outputPath = '/tmp/popen_output'; + cp.on('exit', function (exitCode) { + const outBytes = new Uint8Array( + outByteArrays.reduce( + (acc, curr) => acc + curr.length, + 0 + ) + ); + let offset = 0; + for (const byteArray of outByteArrays) { + outBytes.set(byteArray, offset); + offset += byteArray.length; + } + FS.writeFile(outputPath, outBytes); + HEAPU8[exitCodePtr] = exitCode; + wakeUp(allocateUTF8OnStack(outputPath)); + }); + }); + }); + } + + __asyncjs__js_popen_to_file.sig = 'iiii'; + + function __asyncjs__wasm_poll_socket(socketd, events, timeout) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + const POLLIN = 1; + const POLLPRI = 2; + const POLLOUT = 4; + const POLLERR = 8; + const POLLHUP = 16; + const POLLNVAL = 32; + return returnCallback((wakeUp) => { + const polls = []; + if (socketd in PHPWASM.child_proc_by_fd) { + const procInfo = PHPWASM.child_proc_by_fd[socketd]; + if (procInfo.exited) { + wakeUp(0); + return; + } + polls.push(PHPWASM.awaitEvent(procInfo.stdout, 'data')); + } else if (FS.isSocket(FS.getStream(socketd)?.node.mode)) { + const sock = getSocketFromFD(socketd); + if (!sock) { + wakeUp(0); + return; + } + const lookingFor = new Set(); + if (events & POLLIN || events & POLLPRI) { + if (sock.server) { + for (const client of sock.pending) { + if ((client.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + } else if ((sock.recv_queue || []).length > 0) { + wakeUp(1); + return; + } + } + const webSockets = PHPWASM.getAllWebSockets(sock); + if (!webSockets.length) { + wakeUp(0); + return; + } + for (const ws of webSockets) { + if (events & POLLIN || events & POLLPRI) { + polls.push(PHPWASM.awaitData(ws)); + lookingFor.add('POLLIN'); + } + if (events & POLLOUT) { + polls.push(PHPWASM.awaitConnection(ws)); + lookingFor.add('POLLOUT'); + } + if (events & POLLHUP) { + polls.push(PHPWASM.awaitClose(ws)); + lookingFor.add('POLLHUP'); + } + if (events & POLLERR || events & POLLNVAL) { + polls.push(PHPWASM.awaitError(ws)); + lookingFor.add('POLLERR'); + } + } + } else { + setTimeout(function () { + wakeUp(1); + }, timeout); + return; + } + if (polls.length === 0) { + console.warn( + 'Unsupported poll event ' + + events + + ', defaulting to setTimeout().' + ); + setTimeout(function () { + wakeUp(0); + }, timeout); + return; + } + const promises = polls.map(([promise]) => promise); + const clearPolling = () => + polls.forEach(([, clear]) => clear()); + let awaken = false; + let timeoutId; + Promise.race(promises).then(function (results) { + if (!awaken) { + awaken = true; + wakeUp(1); + if (timeoutId) { + clearTimeout(timeoutId); + } + clearPolling(); + } + }); + if (timeout !== -1) { + timeoutId = setTimeout(function () { + if (!awaken) { + awaken = true; + wakeUp(0); + clearPolling(); + } + }, timeout); + } + }); + }); + } + + __asyncjs__wasm_poll_socket.sig = 'iiii'; + + function __asyncjs__js_fd_read(fd, iov, iovcnt, pnum) { + return Asyncify.handleAsync(async () => { + const returnCallback = (resolver) => new Promise(resolver); + if ( + Asyncify?.State?.Normal === undefined || + Asyncify?.state === Asyncify?.State?.Normal + ) { + var returnCode; + var stream; + let num = 0; + try { + stream = SYSCALLS.getStreamFromFD(fd); + const num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + throw e; + } + if ( + e.errno !== 6 || + !(stream?.fd in PHPWASM.child_proc_by_fd) + ) { + HEAPU32[pnum >> 2] = 0; + return returnCode; + } + } + } + return returnCallback((wakeUp) => { + var retries = 0; + var interval = 50; + var timeout = 5e3; + var maxRetries = timeout / interval; + function poll() { + var returnCode; + var stream; + let num; + try { + stream = SYSCALLS.getStreamFromFD(fd); + num = doReadv(stream, iov, iovcnt); + returnCode = 0; + } catch (e) { + if ( + typeof FS == 'undefined' || + !(e.name === 'ErrnoError') + ) { + console.error(e); + throw e; + } + returnCode = e.errno; + } + const success = returnCode === 0; + const failure = + ++retries > maxRetries || + !(fd in PHPWASM.child_proc_by_fd) || + PHPWASM.child_proc_by_fd[fd]?.exited || + FS.isClosed(stream); + if (success) { + HEAPU32[pnum >> 2] = num; + wakeUp(0); + } else if (failure) { + HEAPU32[pnum >> 2] = 0; + wakeUp(returnCode === 6 ? 0 : returnCode); + } else { + setTimeout(poll, interval); + } + } + poll(); + }); + }); + } + + __asyncjs__js_fd_read.sig = 'iiiii'; + + function __asyncjs__js_module_onMessage(data, response_buffer) { + return Asyncify.handleAsync(async () => { + if (Module['onMessage']) { + const dataStr = UTF8ToString(data); + return Module['onMessage'](dataStr) + .then((response) => { + const responseBytes = + typeof response === 'string' + ? new TextEncoder().encode(response) + : response; + const responseSize = responseBytes.byteLength; + const responsePtr = _malloc(responseSize + 1); + HEAPU8.set(responseBytes, responsePtr); + HEAPU8[responsePtr + responseSize] = 0; + HEAPU8[response_buffer] = responsePtr; + HEAPU8[response_buffer + 1] = responsePtr >> 8; + HEAPU8[response_buffer + 2] = responsePtr >> 16; + HEAPU8[response_buffer + 3] = responsePtr >> 24; + return responseSize; + }) + .catch((e) => { + console.error(e); + return -1; + }); + } + }); + } + + __asyncjs__js_module_onMessage.sig = 'iii'; + + /** @constructor */ function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + + var noExitRuntime = Module['noExitRuntime'] || false; + + /** @type {function(...*):?} */ function _SharpYuvConvert() { + abort('missing function: SharpYuvConvert'); + } + + _SharpYuvConvert.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvGetConversionMatrix() { + abort('missing function: SharpYuvGetConversionMatrix'); + } + + _SharpYuvGetConversionMatrix.stub = true; + + /** @type {function(...*):?} */ function _SharpYuvInit() { + abort('missing function: SharpYuvInit'); + } + + _SharpYuvInit.stub = true; + + var UTF8Decoder = + typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode( + 55296 | (ch >> 10), + 56320 | (ch & 1023) + ); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + + Module['UTF8ToString'] = UTF8ToString; + + var ___assert_fail = (condition, filename, line, func) => { + abort( + `Assertion failed: ${UTF8ToString(condition)}, at: ` + + [ + filename ? UTF8ToString(filename) : 'unknown filename', + line, + func ? UTF8ToString(func) : 'unknown function', + ] + ); + }; + + var wasmTableMirror = []; + + /** @type {WebAssembly.Table} */ var wasmTable; + + var getWasmTableEntry = (funcPtr) => { + var func = wasmTableMirror[funcPtr]; + if (!func) { + if (funcPtr >= wasmTableMirror.length) + wasmTableMirror.length = funcPtr + 1; + wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); + if (Asyncify.isAsyncExport(func)) { + wasmTableMirror[funcPtr] = func = + Asyncify.makeAsyncFunction(func); + } + } + return func; + }; + + var ___call_sighandler = (fp, sig) => getWasmTableEntry(fp)(sig); + + var initRandomFill = () => { + if ( + typeof crypto == 'object' && + typeof crypto['getRandomValues'] == 'function' + ) { + return (view) => crypto.getRandomValues(view); + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + return (view) => crypto_module['randomFillSync'](view); + } + var randomBytes = crypto_module['randomBytes']; + return (view) => (view.set(randomBytes(view.byteLength)), view); + } catch (e) {} + } + abort('initRandomDevice'); + }; + + var randomFill = (view) => (randomFill = initRandomFill())(view); + + 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.substr(-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.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: (path) => { + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ''); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join('/')), + join2: (l, r) => PATH.normalize(l + '/' + r), + }; + + 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).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 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 < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + var FS_stdin_getChar_buffer = []; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + + /** @type {function(string, boolean=, number=)} */ function 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 (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + /** @suppress {missingProperties} */ var fd = process.stdin.fd; + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch (e) { + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } 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: 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) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + 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, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + + 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) return 0; + return zeroMemory(ptr, size); + }; + + var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */ 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, + allocate: MEMFS.stream_ops.allocate, + 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 = null; + } 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.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max( + newCapacity, + (prevCapacity * + (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> + 0 + ); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + 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.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = 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.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode( + parent, + newname, + 511 | /* 0777 */ 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); + if (size > 8 && contents.subarray) { + buffer.set( + contents.subarray(position, position + size), + offset + ); + } else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + 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.timestamp = Date.now(); + if ( + buffer.subarray && + (!node.contents || node.contents.subarray) + ) { + if (canOwn) { + node.contents = buffer.subarray( + offset, + offset + length + ); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set( + buffer.subarray(offset, offset + length), + position + ); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + 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; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max( + stream.node.usedBytes, + offset + length + ); + }, + 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 { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray( + position, + position + length + ); + } else { + contents = Array.prototype.slice.call( + contents, + position, + position + length + ); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ var asyncLoad = ( + url, + onload, + onerror, + noRunDep + ) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync( + url, + (arrayBuffer) => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + } + ); + if (dep) addRunDependency(dep); + }; + + var FS_createDataFile = ( + parent, + name, + fileData, + canRead, + canWrite, + canOwn + ) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + if (typeof Browser != 'undefined') Browser.init(); + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + + var FS_createPreloadedFile = ( + parent, + name, + url, + canRead, + canWrite, + onload, + onerror, + dontCreateFile, + canOwn, + preFinish + ) => { + var fullname = name + ? PATH_FS.resolve(PATH.join2(parent, name)) + : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile( + parent, + name, + byteArray, + canRead, + canWrite, + canOwn + ); + } + onload?.(); + removeRunDependency(dep); + } + if ( + FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + }) + ) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (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_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, + }; + + var NODEFS = { + isWindows: false, + staticInit() { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process.binding('constants'); + if (flags['fs']) { + flags = flags['fs']; + } + NODEFS.flagsForNodeMap = { + 1024: flags['O_APPEND'], + 64: flags['O_CREAT'], + 128: flags['O_EXCL'], + 256: flags['O_NOCTTY'], + 0: flags['O_RDONLY'], + 2: flags['O_RDWR'], + 4096: flags['O_SYNC'], + 512: flags['O_TRUNC'], + 1: flags['O_WRONLY'], + 131072: flags['O_NOFOLLOW'], + }; + }, + convertNodeCode(e) { + var code = e.code; + return ERRNO_CODES[code]; + }, + tryFSOperation(f) { + try { + return f(); + } catch (e) { + if (!e.code) throw e; + if (e.code === 'UNKNOWN') throw new FS.ErrnoError(28); + throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); + } + }, + mount(mount) { + return NODEFS.createNode( + null, + '/', + NODEFS.getMode(mount.opts.root), + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(28); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + }, + getMode(path) { + var stat; + return NODEFS.tryFSOperation(() => { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + stat.mode |= (stat.mode & 292) >> 2; + } + return stat.mode; + }); + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + flagsForNode(flags) { + flags &= ~2097152; + flags &= ~2048; + flags &= ~32768; + flags &= ~524288; + flags &= ~65536; + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + if (flags) { + throw new FS.ErrnoError(28); + } + return newFlags; + }, + node_ops: { + getattr(node) { + var path = NODEFS.realPath(node); + var stat; + NODEFS.tryFSOperation(() => (stat = fs.lstatSync(path))); + if (NODEFS.isWindows) { + if (!stat.blksize) { + stat.blksize = 4096; + } + if (!stat.blocks) { + stat.blocks = + ((stat.size + stat.blksize - 1) / stat.blksize) | 0; + } + stat.mode |= (stat.mode & 292) >> 2; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + }); + }, + lookup(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + }, + mknod(parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + var path = NODEFS.realPath(node); + NODEFS.tryFSOperation(() => { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { + mode: node.mode, + }); + } + }); + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + NODEFS.tryFSOperation(() => fs.renameSync(oldPath, newPath)); + oldNode.name = newName; + }, + unlink(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.unlinkSync(path)); + }, + rmdir(parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + NODEFS.tryFSOperation(() => fs.rmdirSync(path)); + }, + readdir(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readdirSync(path)); + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + NODEFS.tryFSOperation(() => fs.symlinkSync(oldPath, newPath)); + }, + readlink(node) { + var path = NODEFS.realPath(node); + return NODEFS.tryFSOperation(() => fs.readlinkSync(path)); + }, + }, + stream_ops: { + open(stream) { + var path = NODEFS.realPath(stream.node); + NODEFS.tryFSOperation(() => { + if (FS.isFile(stream.node.mode)) { + stream.shared.refcount = 1; + stream.nfd = fs.openSync( + path, + NODEFS.flagsForNode(stream.flags) + ); + } + }); + }, + close(stream) { + NODEFS.tryFSOperation(() => { + if ( + FS.isFile(stream.node.mode) && + stream.nfd && + --stream.shared.refcount === 0 + ) { + fs.closeSync(stream.nfd); + } + }); + }, + dup(stream) { + stream.shared.refcount++; + }, + read(stream, buffer, offset, length, position) { + if (length === 0) return 0; + return NODEFS.tryFSOperation(() => + fs.readSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + write(stream, buffer, offset, length, position) { + return NODEFS.tryFSOperation(() => + fs.writeSync( + stream.nfd, + new Int8Array(buffer.buffer, offset, length), + 0, + length, + position + ) + ); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + NODEFS.tryFSOperation(() => { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + }); + } + } + 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 = mmapAlloc(length); + NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); + return { + ptr: ptr, + allocated: true, + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + NODEFS.stream_ops.write( + stream, + buffer, + 0, + length, + offset, + false + ); + return 0; + }, + }, + }; + + var PROXYFS = { + mount(mount) { + return PROXYFS.createNode( + null, + '/', + mount.opts.fs.lstat(mount.opts.root).mode, + 0 + ); + }, + createNode(parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = PROXYFS.node_ops; + node.stream_ops = PROXYFS.stream_ops; + return node; + }, + realPath(node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join(...parts); + }, + node_ops: { + getattr(node) { + var path = PROXYFS.realPath(node); + var stat; + try { + stat = node.mount.opts.fs.lstat(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks, + }; + }, + setattr(node, attr) { + var path = PROXYFS.realPath(node); + try { + if (attr.mode !== undefined) { + node.mount.opts.fs.chmod(path, attr.mode); + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + node.mount.opts.fs.utime(path, date, date); + } + if (attr.size !== undefined) { + node.mount.opts.fs.truncate(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + lookup(parent, name) { + try { + var path = PATH.join2(PROXYFS.realPath(parent), name); + var mode = parent.mount.opts.fs.lstat(path).mode; + var node = PROXYFS.createNode(parent, name, mode); + return node; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + mknod(parent, name, mode, dev) { + var node = PROXYFS.createNode(parent, name, mode, dev); + var path = PROXYFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + node.mount.opts.fs.mkdir(path, node.mode); + } else { + node.mount.opts.fs.writeFile(path, '', { + mode: node.mode, + }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + }, + rename(oldNode, newDir, newName) { + var oldPath = PROXYFS.realPath(oldNode); + var newPath = PATH.join2(PROXYFS.realPath(newDir), newName); + try { + oldNode.mount.opts.fs.rename(oldPath, newPath); + oldNode.name = newName; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + unlink(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.unlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + rmdir(parent, name) { + var path = PATH.join2(PROXYFS.realPath(parent), name); + try { + parent.mount.opts.fs.rmdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readdir(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readdir(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + symlink(parent, newName, oldPath) { + var newPath = PATH.join2(PROXYFS.realPath(parent), newName); + try { + parent.mount.opts.fs.symlink(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + readlink(node) { + var path = PROXYFS.realPath(node); + try { + return node.mount.opts.fs.readlink(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + }, + stream_ops: { + open(stream) { + var path = PROXYFS.realPath(stream.node); + try { + stream.nfd = stream.node.mount.opts.fs.open( + path, + stream.flags + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + close(stream) { + try { + stream.node.mount.opts.fs.close(stream.nfd); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + read(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.read( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + write(stream, buffer, offset, length, position) { + try { + return stream.node.mount.opts.fs.write( + stream.nfd, + buffer, + offset, + length, + position + ); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + try { + var stat = stream.node.node_ops.getattr( + stream.node + ); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }, + }, + }; + + var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: '/', + initialized: false, + ignorePermissions: true, + ErrnoError: class { + constructor(errno) { + this.name = 'ErrnoError'; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + this.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 { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | /*292*/ 73; + /*73*/ this.writeMode = 146; + } + /*146*/ 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 = {}) { + path = PATH_FS.resolve(path); + if (!path) + return { + path: '', + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = path.split('/').filter((p) => !!p); + var current = FS.root; + var current_path = '/'; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve( + PATH.dirname(current_path), + link + ); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== '/' + ? `${mount}/${path}` + : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 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; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else 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) { + 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; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + 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; + }, + 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); + } + } + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + 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: type, + opts: opts, + mountpoint: 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); + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + 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 || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + 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); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + 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; + } + /* 0666 */ 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; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.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 PATH_FS.resolve( + FS.getPath(link.parent), + link.node_ops.readlink(link) + ); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + 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; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + 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); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open(path, flags, mode) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = + typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if (flags & 64) { + mode = typeof mode == 'undefined' ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } catch (e) {} + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 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: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + 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; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + 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); + } + 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') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + 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') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array( + data, + buf, + 0, + buf.length + ); + FS.write( + stream, + buf, + 0, + actualNumBytes, + undefined, + opts.canOwn + ); + } else if (ArrayBuffer.isView(data)) { + FS.write( + stream, + data, + 0, + data.byteLength, + undefined, + opts.canOwn + ); + } else { + throw new Error('Unsupported data type'); + } + 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, + }); + 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) { + randomLeft = randomFill(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', + 16384 | 511, + /* 0777 */ 73 + ); + 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, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, + {}, + '/proc/self/fd' + ); + }, + createStandardStreams() { + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } 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() { + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, '/'); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + NODEFS: NODEFS, + PROXYFS: PROXYFS, + }; + }, + init(input, output, error) { + FS.init.initialized = true; + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + _fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + 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) {} + 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) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + 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); + if (!FS.createDevice.major) 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) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error( + 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.' + ); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error( + 'Cannot load without read() or XMLHttpRequest.' + ); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + get(idx) { + if (idx > this.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 + ) + ) + throw new Error( + "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) + throw new Error( + 'invalid range (' + + from + + ', ' + + to + + ') or no bytes requested!' + ); + if (to > datalength - 1) + throw new Error( + '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 + ) + ) + throw new Error( + "Couldn't load " + + url + + '. Status: ' + + xhr.status + ); + if (xhr.response !== undefined) { + return new Uint8Array( + /** @type{Array} */ (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') + throw new Error('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 (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) + throw '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: 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 = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + 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 < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + stream_ops.read = (stream, buffer, offset, length, position) => { + 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: ptr, + allocated: true, + }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + Module['FS'] = FS; + + var SOCKFS = { + mount(mount) { + Module['websocket'] = + Module['websocket'] && 'object' === typeof Module['websocket'] + ? Module['websocket'] + : {}; + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = /** @this{Object} */ function ( + event, + callback + ) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + Module['websocket'].emit = /** @this{Object} */ function ( + event, + param + ) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createSocket(family, type, protocol) { + type &= ~526336; + var streaming = type == 1; + if (streaming && protocol && protocol != 6) { + throw new FS.ErrnoError(66); + } + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops, + }; + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + var stream = FS.createStream({ + path: name, + node: node, + flags: 2, + seekable: false, + stream_ops: SOCKFS.stream_ops, + }); + sock.stream = stream; + return sock; + }, + getSocket(fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + }, + stream_ops: { + poll(stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + }, + ioctl(stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + }, + close(stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }, + }, + nextname() { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + SOCKFS.nextname.current++ + ']'; + }, + websocket_sock_ops: { + createPeer(sock, addr, port) { + var ws; + if (typeof addr == 'object') { + ws = addr; + addr = null; + port = null; + } + if (ws) { + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error( + 'WebSocket URL must be in the format ws(s)://address:port' + ); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + try { + var runtimeConfig = + Module['websocket'] && + 'object' === typeof Module['websocket']; + var url = 'ws:#'.replace('#', '//'); + if (runtimeConfig) { + if ( + 'function' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url'](...arguments); + } else if ( + 'string' === typeof Module['websocket']['url'] + ) { + url = Module['websocket']['url']; + } + } + if (url === 'ws://' || url === 'wss://') { + var parts = addr.split('/'); + url = + url + + parts[0] + + ':' + + port + + '/' + + parts.slice(1).join('/'); + } + var subProtocols = 'binary'; + if (runtimeConfig) { + if ( + 'string' === + typeof Module['websocket']['subprotocol'] + ) { + subProtocols = + Module['websocket']['subprotocol']; + } + } + var opts = undefined; + if (subProtocols !== 'null') { + subProtocols = subProtocols + .replace(/^ +| +$/g, '') + .split(/ *, */); + opts = subProtocols; + } + if ( + runtimeConfig && + null === Module['websocket']['subprotocol'] + ) { + subProtocols = 'null'; + opts = undefined; + } + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = + /** @type{(typeof WebSocket)} */ ( + require('ws') + ); + } else { + WebSocketConstructor = WebSocket; + } + if (Module['websocket']['decorator']) { + WebSocketConstructor = + Module['websocket']['decorator']( + WebSocketConstructor + ); + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(23); + } + } + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [], + }; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + if (sock.type === 2 && typeof sock.sport != 'undefined') { + peer.dgram_send_queue.push( + new Uint8Array([ + 255, + 255, + 255, + 255, + 'p'.charCodeAt(0), + 'o'.charCodeAt(0), + 'r'.charCodeAt(0), + 't'.charCodeAt(0), + (sock.sport & 65280) >> 8, + sock.sport & 255, + ]) + ); + } + return peer; + }, + getPeer(sock, addr, port) { + return sock.peers[addr + ':' + port]; + }, + addPeer(sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + }, + removePeer(sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + }, + handlePeerEvents(sock, peer) { + var first = true; + var handleOpen = function () { + Module['websocket'].emit('open', sock.stream.fd); + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + peer.socket.close(); + } + }; + function handleMessage(data) { + if (typeof data == 'string') { + var encoder = new TextEncoder(); + data = encoder.encode(data); + } else { + assert(data.byteLength !== undefined); + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); + } + var wasfirst = first; + first = false; + if ( + wasfirst && + data.length === 10 && + data[0] === 255 && + data[1] === 255 && + data[2] === 255 && + data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && + data[5] === 'o'.charCodeAt(0) && + data[6] === 'r'.charCodeAt(0) && + data[7] === 't'.charCodeAt(0) + ) { + var newport = (data[8] << 8) | data[9]; + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + sock.recv_queue.push({ + addr: peer.addr, + port: peer.port, + data: data, + }); + Module['websocket'].emit('message', sock.stream.fd); + } + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function (data, isBinary) { + if (!isBinary) { + return; + } + handleMessage(new Uint8Array(data).buffer); + }); + peer.socket.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function () { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage( + event + ) { + handleMessage(event.data); + }; + peer.socket.onerror = function (error) { + sock.error = 14; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'ECONNREFUSED: Connection refused', + ]); + }; + } + }, + poll(sock) { + if (sock.type === 1 && sock.server) { + return sock.pending.length ? 64 | 1 : 0; + } + var mask = 0; + var dest = + sock.type === 1 + ? SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ) + : null; + if ( + sock.recv_queue.length || + !dest || + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 64 | 1; + } + if ( + !dest || + (dest && dest.socket.readyState === dest.socket.OPEN) + ) { + mask |= 4; + } + if ( + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED) + ) { + mask |= 16; + } + return mask; + }, + ioctl(sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[arg >> 2] = bytes; + return 0; + + default: + return 28; + } + }, + close(sock) { + if (sock.server) { + try { + sock.server.close(); + } catch (e) {} + sock.server = null; + } + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) {} + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + }, + bind(sock, addr, port) { + if ( + typeof sock.saddr != 'undefined' || + typeof sock.sport != 'undefined' + ) { + throw new FS.ErrnoError(28); + } + sock.saddr = addr; + sock.sport = port; + if (sock.type === 2) { + if (sock.server) { + sock.server.close(); + sock.server = null; + } + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e.name === 'ErrnoError')) throw e; + if (e.errno !== 138) throw e; + } + } + }, + connect(sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(138); + } + if ( + typeof sock.daddr != 'undefined' && + typeof sock.dport != 'undefined' + ) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(7); + } else { + throw new FS.ErrnoError(30); + } + } + } + var peer = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + sock.daddr = peer.addr; + sock.dport = peer.port; + throw new FS.ErrnoError(26); + }, + listen(sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(138); + } + if (sock.server) { + throw new FS.ErrnoError(28); + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + if (Module['websocket']['serverDecorator']) { + WebSocketServer = + Module['websocket']['serverDecorator'](WebSocketServer); + } + sock.server = new WebSocketServer({ + host: host, + port: sock.sport, + }); + Module['websocket'].emit('listen', sock.stream.fd); + sock.server.on('connection', function (ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket( + sock.family, + sock.type, + sock.protocol + ); + var peer = SOCKFS.websocket_sock_ops.createPeer( + newsock, + ws + ); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + sock.pending.push(newsock); + Module['websocket'].emit( + 'connection', + newsock.stream.fd + ); + } else { + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('close', function () { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function (error) { + sock.error = 23; + Module['websocket'].emit('error', [ + sock.stream.fd, + sock.error, + 'EHOSTUNREACH: Host is unreachable', + ]); + }); + }, + accept(listensock) { + if (!listensock.server || !listensock.pending.length) { + throw new FS.ErrnoError(28); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + }, + getname(sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(53); + } + addr = sock.daddr; + port = sock.dport; + } else { + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { + addr: addr, + port: port, + }; + }, + sendmsg(sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(17); + } + } else { + addr = sock.daddr; + port = sock.dport; + } + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + if (sock.type === 1) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + throw new FS.ErrnoError(53); + } else if ( + dest.socket.readyState === dest.socket.CONNECTING + ) { + throw new FS.ErrnoError(6); + } + } + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + var data; + data = buffer.slice(offset, offset + length); + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + if ( + !dest || + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + dest = SOCKFS.websocket_sock_ops.createPeer( + sock, + addr, + port + ); + } + dest.dgram_send_queue.push(data); + return length; + } + } + try { + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(28); + } + }, + recvmsg(sock, length, flags) { + if (sock.type === 1 && sock.server) { + throw new FS.ErrnoError(53); + } + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer( + sock, + sock.daddr, + sock.dport + ); + if (!dest) { + throw new FS.ErrnoError(53); + } + if ( + dest.socket.readyState === dest.socket.CLOSING || + dest.socket.readyState === dest.socket.CLOSED + ) { + return null; + } + throw new FS.ErrnoError(6); + } + throw new FS.ErrnoError(6); + } + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array( + queuedBuffer, + queuedOffset, + bytesRead + ), + addr: queued.addr, + port: queued.port, + }; + if (flags & 2) { + bytesRead = 0; + } + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array( + queuedBuffer, + queuedOffset + bytesRead, + bytesRemaining + ); + sock.recv_queue.unshift(queued); + } + return res; + }, + }, + }; + + var getSocketFromFD = (fd) => { + var socket = SOCKFS.getSocket(fd); + if (!socket) throw new FS.ErrnoError(8); + return socket; + }; + + var inetPton4 = (str) => { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + }; + + /** @suppress {checkTypes} */ var jstoi_q = (str) => parseInt(str); + + var inetPton6 = (str) => { + var words; + var w, offset, z; + /* http://home.deds.nl/~aeron/regex/ */ var valid6regx = + /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i; + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === '::') { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + if (str.startsWith('::')) { + str = str.replace('::', 'Z:'); + } else { + str = str.replace('::', ':Z:'); + } + if (str.indexOf('.') > 0) { + str = str.replace(new RegExp('[.]', 'g'), ':'); + words = str.split(':'); + words[words.length - 4] = + jstoi_q(words[words.length - 4]) + + jstoi_q(words[words.length - 3]) * 256; + words[words.length - 3] = + jstoi_q(words[words.length - 2]) + + jstoi_q(words[words.length - 1]) * 256; + words = words.slice(0, words.length - 2); + } else { + words = str.split(':'); + } + offset = 0; + z = 0; + for (w = 0; w < words.length; w++) { + if (typeof words[w] == 'string') { + if (words[w] === 'Z') { + for (z = 0; z < 8 - words.length + 1; z++) { + parts[w + z] = 0; + } + offset = z - 1; + } else { + parts[w + offset] = _htons(parseInt(words[w], 16)); + } + } else { + parts[w + offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6], + ]; + }; + + /** @param {number=} addrlen */ var writeSockaddr = ( + sa, + family, + addr, + port, + addrlen + ) => { + switch (family) { + case 2: + addr = inetPton4(addr); + zeroMemory(sa, 16); + if (addrlen) { + HEAP32[addrlen >> 2] = 16; + } + HEAP16[sa >> 1] = family; + HEAP32[(sa + 4) >> 2] = addr; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + case 10: + addr = inetPton6(addr); + zeroMemory(sa, 28); + if (addrlen) { + HEAP32[addrlen >> 2] = 28; + } + HEAP32[sa >> 2] = family; + HEAP32[(sa + 8) >> 2] = addr[0]; + HEAP32[(sa + 12) >> 2] = addr[1]; + HEAP32[(sa + 16) >> 2] = addr[2]; + HEAP32[(sa + 20) >> 2] = addr[3]; + HEAP16[(sa + 2) >> 1] = _htons(port); + break; + + default: + return 5; + } + return 0; + }; + + var DNS = { + address_map: { + id: 1, + addrs: {}, + names: {}, + }, + lookup_name(name) { + var res = inetPton4(name); + if (res !== null) { + return name; + } + res = inetPton6(name); + if (res !== null) { + return name; + } + var addr; + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + addr = '172.29.' + (id & 255) + '.' + (id & 65280); + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + return addr; + }, + lookup_addr(addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + return null; + }, + }; + + function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) { + try { + var sock = getSocketFromFD(fd); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var errno = writeSockaddr( + addr, + newsock.family, + DNS.lookup_name(newsock.daddr), + newsock.dport, + addrlen + ); + } + return newsock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var inetNtop4 = (addr) => + (addr & 255) + + '.' + + ((addr >> 8) & 255) + + '.' + + ((addr >> 16) & 255) + + '.' + + ((addr >> 24) & 255); + + var inetNtop6 = (ints) => { + var str = ''; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 65535, + ints[0] >> 16, + ints[1] & 65535, + ints[1] >> 16, + ints[2] & 65535, + ints[2] >> 16, + ints[3] & 65535, + ints[3] >> 16, + ]; + var hasipv4 = true; + var v4part = ''; + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { + hasipv4 = false; + break; + } + } + if (hasipv4) { + v4part = inetNtop4(parts[6] | (parts[7] << 16)); + if (parts[5] === -1) { + str = '::ffff:'; + str += v4part; + return str; + } + if (parts[5] === 0) { + str = '::'; + if (v4part === '0.0.0.0') v4part = ''; + if (v4part === '0.0.0.1') v4part = '1'; + str += v4part; + return str; + } + } + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + for (word = 0; word < 8; word++) { + if (longest > 1) { + if ( + parts[word] === 0 && + word >= zstart && + word < zstart + longest + ) { + if (word === zstart) { + str += ':'; + if (zstart === 0) str += ':'; + } + continue; + } + } + str += Number(_ntohs(parts[word] & 65535)).toString(16); + str += word < 7 ? ':' : ''; + } + return str; + }; + + var readSockaddr = (sa, salen) => { + var family = HEAP16[sa >> 1]; + var port = _ntohs(HEAPU16[(sa + 2) >> 1]); + var addr; + switch (family) { + case 2: + if (salen !== 16) { + return { + errno: 28, + }; + } + addr = HEAP32[(sa + 4) >> 2]; + addr = inetNtop4(addr); + break; + + case 10: + if (salen !== 28) { + return { + errno: 28, + }; + } + addr = [ + HEAP32[(sa + 8) >> 2], + HEAP32[(sa + 12) >> 2], + HEAP32[(sa + 16) >> 2], + HEAP32[(sa + 20) >> 2], + ]; + addr = inetNtop6(addr); + break; + + default: + return { + errno: 5, + }; + } + return { + family: family, + addr: addr, + port: port, + }; + }; + + /** @param {boolean=} allowNull */ var getSocketAddress = ( + addrp, + addrlen, + allowNull + ) => { + if (allowNull && addrp === 0) return null; + var info = readSockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + }; + + function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var SYSCALLS = { + DEFAULT_POLLMASK: 5, + 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 PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[buf >> 2] = stat.dev; + HEAP32[(buf + 4) >> 2] = stat.mode; + HEAPU32[(buf + 8) >> 2] = stat.nlink; + HEAP32[(buf + 12) >> 2] = stat.uid; + HEAP32[(buf + 16) >> 2] = stat.gid; + HEAP32[(buf + 20) >> 2] = stat.rdev; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 24) >> 2] = tempI64[0]), + (HEAP32[(buf + 28) >> 2] = tempI64[1]); + HEAP32[(buf + 32) >> 2] = 4096; + HEAP32[(buf + 36) >> 2] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ + Math.floor(atime / 1e3) >>> 0, + ((tempDouble = Math.floor(atime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 40) >> 2] = tempI64[0]), + (HEAP32[(buf + 44) >> 2] = tempI64[1]); + HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(mtime / 1e3) >>> 0, + ((tempDouble = Math.floor(mtime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 56) >> 2] = tempI64[0]), + (HEAP32[(buf + 60) >> 2] = tempI64[1]); + HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3; + (tempI64 = [ + Math.floor(ctime / 1e3) >>> 0, + ((tempDouble = Math.floor(ctime / 1e3)), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 72) >> 2] = tempI64[0]), + (HEAP32[(buf + 76) >> 2] = tempI64[1]); + HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(buf + 88) >> 2] = tempI64[0]), + (HEAP32[(buf + 92) >> 2] = tempI64[1]); + return 0; + }, + 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; + }, + }; + + function ___syscall_chdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.chdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_chmod(path, mode) { + try { + path = SYSCALLS.getStr(path); + FS.chmod(path, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var info = getSocketAddress(addr, addrlen); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup(fd) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + return FS.dupStream(old).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_dup3(fd, newfd, flags) { + try { + var old = SYSCALLS.getStreamFromFD(fd); + if (old.fd === newfd) return -28; + var existing = FS.getStream(newfd); + if (existing) FS.close(existing); + return FS.dupStream(old, newfd).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_faccessat(dirfd, path, amode, flags) { + 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 && + /* otherwise, they've just passed F_OK */ FS.nodePermissions( + node, + perms + ) + ) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + + function ___syscall_fallocate( + fd, + mode, + offset_low, + offset_high, + len_low, + len_high + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + var len = convertI32PairToI53Checked(len_low, len_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.allocate(stream, offset, len); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchmod(fd, mode) { + try { + FS.fchmod(fd, mode); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchown32(fd, owner, group) { + try { + FS.fchown(fd, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fchownat(dirfd, path, owner, group, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + flags = flags & ~256; + path = SYSCALLS.calculateAt(dirfd, path); + (nofollow ? FS.lchown : FS.chown)(path, owner, group); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + /** @suppress {duplicate } */ function syscallGetVarargI() { + var ret = HEAP32[+SYSCALLS.varargs >> 2]; + SYSCALLS.varargs += 4; + return ret; + } + + var syscallGetVarargP = syscallGetVarargI; + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + case 3: + return stream.flags; + + case 4: { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + HEAP16[(arg + offset) >> 1] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fdatasync(fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_fstat64(fd, buf) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ftruncate64(fd, length_low, length_high) { + var length = convertI32PairToI53Checked(length_low, length_high); + try { + if (isNaN(length)) return 61; + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => + stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + + Module['stringToUTF8'] = stringToUTF8; + + function ___syscall_getcwd(buf, size) { + try { + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getdents64(fd, dirp, count) { + 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 idx = Math.floor(off / struct_size); + while (idx < stream.getdents.length && pos + struct_size <= count) { + var id; + var type; + var name = stream.getdents[idx]; + if (name === '.') { + id = stream.node.id; + type = 4; + } else if (name === '..') { + var lookup = FS.lookupPath(stream.path, { + parent: true, + }); + id = lookup.node.id; + type = 4; + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) + ? 2 + : FS.isDir(child.mode) + ? 4 + : FS.isLink(child.mode) + ? 10 + : 8; + } + (tempI64 = [ + id >>> 0, + ((tempDouble = id), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]); + (tempI64 = [ + ((idx + 1) * struct_size) >>> 0, + ((tempDouble = (idx + 1) * struct_size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]), + (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]); + HEAP16[(dirp + pos + 16) >> 1] = 280; + HEAP8[dirp + pos + 18] = type; + stringToUTF8(name, dirp + pos + 19, 256); + pos += struct_size; + idx += 1; + } + FS.llseek(stream, idx * struct_size, 0); + return pos; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + if (!sock.daddr) { + return -53; + } + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.daddr), + sock.dport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) { + try { + var sock = getSocketFromFD(fd); + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(sock.saddr || '0.0.0.0'), + sock.sport, + addrlen + ); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) { + try { + var sock = getSocketFromFD(fd); + if (level === 1) { + if (optname === 4) { + HEAP32[optval >> 2] = sock.error; + HEAP32[optlen >> 2] = 4; + sock.error = null; + return 0; + } + } + return -50; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + 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] = termios.c_iflag || 0; + HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0; + HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0; + HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[argp + i + 17] = 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]; + var c_oflag = HEAP32[(argp + 4) >> 2]; + var c_cflag = HEAP32[(argp + 8) >> 2]; + var c_lflag = HEAP32[(argp + 12) >> 2]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[argp + i + 17]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag: c_iflag, + c_oflag: c_oflag, + c_cflag: c_cflag, + c_lflag: c_lflag, + c_cc: c_cc, + }); + } + return 0; + } + + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[argp >> 2] = 0; + return 0; + } + + case 21520: { + if (!stream.tty) return -59; + return -28; + } + + 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] = winsize[0]; + HEAP16[(argp + 2) >> 1] = 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_listen(fd, backlog) { + try { + var sock = getSocketFromFD(fd); + sock.sock_ops.listen(sock, backlog); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_lstat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_mkdirat(dirfd, path, mode) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + path = PATH.normalize(path); + if (path[path.length - 1] === '/') + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_newfstatat(dirfd, path, buf, flags) { + try { + path = SYSCALLS.getStr(path); + var nofollow = flags & 256; + var allowEmpty = flags & 4096; + flags = flags & ~6400; + path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + 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 PIPEFS = { + BUCKET_BUFFER_SIZE: 8192, + mount(mount) { + return FS.createNode(null, '/', 16384 | 511, /* 0777 */ 0); + }, + createPipe() { + var pipe = { + buckets: [], + refcnt: 2, + }; + pipe.buckets.push({ + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }); + var rName = PIPEFS.nextname(); + var wName = PIPEFS.nextname(); + var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0); + var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0); + rNode.pipe = pipe; + wNode.pipe = pipe; + var readableStream = FS.createStream({ + path: rName, + node: rNode, + flags: 0, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + rNode.stream = readableStream; + var writableStream = FS.createStream({ + path: wName, + node: wNode, + flags: 1, + seekable: false, + stream_ops: PIPEFS.stream_ops, + }); + wNode.stream = writableStream; + return { + readable_fd: readableStream.fd, + writable_fd: writableStream.fd, + }; + }, + stream_ops: { + poll(stream) { + var pipe = stream.node.pipe; + if ((stream.flags & 2097155) === 1) { + return 256 | 4; + } + if (pipe.buckets.length > 0) { + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + if (bucket.offset - bucket.roffset > 0) { + return 64 | 1; + } + } + } + return 0; + }, + ioctl(stream, request, varargs) { + return 28; + }, + fsync(stream) { + return 28; + }, + read(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var currentLength = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var bucket = pipe.buckets[i]; + currentLength += bucket.offset - bucket.roffset; + } + var data = buffer.subarray(offset, offset + length); + if (length <= 0) { + return 0; + } + if (currentLength == 0) { + throw new FS.ErrnoError(6); + } + var toRead = Math.min(currentLength, length); + var totalRead = toRead; + var toRemove = 0; + for (var i = 0; i < pipe.buckets.length; i++) { + var currBucket = pipe.buckets[i]; + var bucketSize = currBucket.offset - currBucket.roffset; + if (toRead <= bucketSize) { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + if (toRead < bucketSize) { + tmpSlice = tmpSlice.subarray(0, toRead); + currBucket.roffset += toRead; + } else { + toRemove++; + } + data.set(tmpSlice); + break; + } else { + var tmpSlice = currBucket.buffer.subarray( + currBucket.roffset, + currBucket.offset + ); + data.set(tmpSlice); + data = data.subarray(tmpSlice.byteLength); + toRead -= tmpSlice.byteLength; + toRemove++; + } + } + if (toRemove && toRemove == pipe.buckets.length) { + toRemove--; + pipe.buckets[toRemove].offset = 0; + pipe.buckets[toRemove].roffset = 0; + } + pipe.buckets.splice(0, toRemove); + return totalRead; + }, + write(stream, buffer, offset, length, position) { + /* ignored */ var pipe = stream.node.pipe; + var data = buffer.subarray(offset, offset + length); + var dataLen = data.byteLength; + if (dataLen <= 0) { + return 0; + } + var currBucket = null; + if (pipe.buckets.length == 0) { + currBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: 0, + roffset: 0, + }; + pipe.buckets.push(currBucket); + } else { + currBucket = pipe.buckets[pipe.buckets.length - 1]; + } + assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE); + var freeBytesInCurrBuffer = + PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset; + if (freeBytesInCurrBuffer >= dataLen) { + currBucket.buffer.set(data, currBucket.offset); + currBucket.offset += dataLen; + return dataLen; + } else if (freeBytesInCurrBuffer > 0) { + currBucket.buffer.set( + data.subarray(0, freeBytesInCurrBuffer), + currBucket.offset + ); + currBucket.offset += freeBytesInCurrBuffer; + data = data.subarray( + freeBytesInCurrBuffer, + data.byteLength + ); + } + var numBuckets = + (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0; + var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE; + for (var i = 0; i < numBuckets; i++) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: PIPEFS.BUCKET_BUFFER_SIZE, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set( + data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE) + ); + data = data.subarray( + PIPEFS.BUCKET_BUFFER_SIZE, + data.byteLength + ); + } + if (remElements > 0) { + var newBucket = { + buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE), + offset: data.byteLength, + roffset: 0, + }; + pipe.buckets.push(newBucket); + newBucket.buffer.set(data); + } + return dataLen; + }, + close(stream) { + var pipe = stream.node.pipe; + pipe.refcnt--; + if (pipe.refcnt === 0) { + pipe.buckets = null; + } + }, + }, + nextname() { + if (!PIPEFS.nextname.current) { + PIPEFS.nextname.current = 0; + } + return 'pipe[' + PIPEFS.nextname.current++ + ']'; + }, + }; + + function ___syscall_pipe(fdPtr) { + try { + if (fdPtr == 0) { + throw new FS.ErrnoError(21); + } + var res = PIPEFS.createPipe(); + HEAP32[fdPtr >> 2] = res.readable_fd; + HEAP32[(fdPtr + 4) >> 2] = res.writable_fd; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_poll(fds, nfds, timeout) { + try { + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[pollfd >> 2]; + var events = HEAP16[(pollfd + 4) >> 1]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops?.poll) { + mask = stream.stream_ops.poll(stream, -1); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(pollfd + 6) >> 1] = mask; + } + return nonzero; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len] = endChar; + return len; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) { + try { + var sock = getSocketFromFD(fd); + var msg = sock.sock_ops.recvmsg( + sock, + len, + typeof flags !== 'undefined' ? flags : 0 + ); + if (!msg) return 0; + if (addr) { + var errno = writeSockaddr( + addr, + sock.family, + DNS.lookup_name(msg.addr), + msg.port, + addrlen + ); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { + try { + oldpath = SYSCALLS.getStr(oldpath); + newpath = SYSCALLS.getStr(newpath); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_rmdir(path) { + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_sendto(fd, message, length, flags, addr, addr_len) { + try { + var sock = getSocketFromFD(fd); + var dest = getSocketAddress(addr, addr_len, true); + if (!dest) { + return FS.write(sock.stream, HEAP8, message, length); + } + return sock.sock_ops.sendmsg( + sock, + HEAP8, + message, + length, + dest.addr, + dest.port + ); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_socket(domain, type, protocol) { + try { + var sock = SOCKFS.createSocket(domain, type, protocol); + return sock.stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_stat64(path, buf) { + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_statfs64(path, size, buf) { + try { + path = SYSCALLS.getStr(path); + HEAP32[(buf + 4) >> 2] = 4096; + HEAP32[(buf + 40) >> 2] = 4096; + HEAP32[(buf + 8) >> 2] = 1e6; + HEAP32[(buf + 12) >> 2] = 5e5; + HEAP32[(buf + 16) >> 2] = 5e5; + HEAP32[(buf + 20) >> 2] = FS.nextInode; + HEAP32[(buf + 24) >> 2] = 1e6; + HEAP32[(buf + 28) >> 2] = 42; + HEAP32[(buf + 44) >> 2] = 2; + HEAP32[(buf + 36) >> 2] = 255; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_symlink(target, linkpath) { + try { + target = SYSCALLS.getStr(target); + linkpath = SYSCALLS.getStr(linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_unlinkat(dirfd, path, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var readI53FromI64 = (ptr) => + HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296; + + function ___syscall_utimensat(dirfd, path, times, flags) { + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path, true); + if (!times) { + var atime = Date.now(); + var mtime = atime; + } else { + var seconds = readI53FromI64(times); + var nanoseconds = HEAP32[(times + 8) >> 2]; + atime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + times += 16; + seconds = readI53FromI64(times); + nanoseconds = HEAP32[(times + 8) >> 2]; + mtime = seconds * 1e3 + nanoseconds / (1e3 * 1e3); + } + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var __abort_js = () => { + abort(''); + }; + + var nowIsMonotonic = 1; + + var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + + var __emscripten_lookup_name = (name) => { + var nameString = UTF8ToString(name); + return inetPton4(DNS.lookup_name(nameString)); + }; + + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + + function __gmtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getUTCSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay(); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + } + + var isLeapYear = (year) => + year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + + var MONTH_DAYS_LEAP_CUMULATIVE = [ + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + ]; + + var MONTH_DAYS_REGULAR_CUMULATIVE = [ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + ]; + + var ydayFromDate = (date) => { + var leap = isLeapYear(date.getFullYear()); + var monthDaysCumulative = leap + ? MONTH_DAYS_LEAP_CUMULATIVE + : MONTH_DAYS_REGULAR_CUMULATIVE; + var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; + return yday; + }; + + function __localtime_js(time_low, time_high, tmPtr) { + var time = convertI32PairToI53Checked(time_low, time_high); + var date = new Date(time * 1e3); + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = + (summerOffset != winterOffset && + date.getTimezoneOffset() == + Math.min(winterOffset, summerOffset)) | 0; + HEAP32[(tmPtr + 32) >> 2] = dst; + } + + /** @suppress {duplicate } */ var setTempRet0 = (val) => + __emscripten_tempret_set(val); + + var __mktime_js = function (tmPtr) { + var ret = (() => { + var date = new Date( + HEAP32[(tmPtr + 20) >> 2] + 1900, + HEAP32[(tmPtr + 16) >> 2], + HEAP32[(tmPtr + 12) >> 2], + HEAP32[(tmPtr + 8) >> 2], + HEAP32[(tmPtr + 4) >> 2], + HEAP32[tmPtr >> 2], + 0 + ); + var dst = HEAP32[(tmPtr + 32) >> 2]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date( + date.getFullYear(), + 6, + 1 + ).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); + if (dst < 0) { + HEAP32[(tmPtr + 32) >> 2] = Number( + summerOffset != winterOffset && dstOffset == guessedOffset + ); + } else if (dst > 0 != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + date.setTime( + date.getTime() + (trueOffset - guessedOffset) * 6e4 + ); + } + HEAP32[(tmPtr + 24) >> 2] = date.getDay(); + var yday = ydayFromDate(date) | 0; + HEAP32[(tmPtr + 28) >> 2] = yday; + HEAP32[tmPtr >> 2] = date.getSeconds(); + HEAP32[(tmPtr + 4) >> 2] = date.getMinutes(); + HEAP32[(tmPtr + 8) >> 2] = date.getHours(); + HEAP32[(tmPtr + 12) >> 2] = date.getDate(); + HEAP32[(tmPtr + 16) >> 2] = date.getMonth(); + HEAP32[(tmPtr + 20) >> 2] = date.getYear(); + var timeMs = date.getTime(); + if (isNaN(timeMs)) { + return -1; + } + return timeMs / 1e3; + })(); + return ( + setTempRet0( + ((tempDouble = ret), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0) + ), + ret >>> 0 + ); + }; + + function __mmap_js( + len, + prot, + flags, + fd, + offset_low, + offset_high, + allocated, + addr + ) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + var res = FS.mmap(stream, len, offset, prot, flags); + var ptr = res.ptr; + HEAP32[allocated >> 2] = res.allocated; + HEAPU32[addr >> 2] = 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_low, offset_high) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + 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 runtimeKeepaliveCounter = 0; + + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + /** @param {boolean|number=} implicit */ var exitJS = ( + status, + implicit + ) => { + EXITSTATUS = status; + if (!keepRuntimeAlive()) { + exitRuntime(); + } + _proc_exit(status); + }; + + var _exit = exitJS; + + Module['_exit'] = _exit; + + var maybeExit = () => { + if (runtimeExited) { + return; + } + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + + var callUserCallback = (func) => { + if (runtimeExited || ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + + var _emscripten_get_now; + + _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: id, + timeout_ms: timeout_ms, + }; + return 0; + }; + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + HEAPU32[timezone >> 2] = stdTimezoneOffset * 60; + HEAP32[daylight >> 2] = Number(winterOffset != summerOffset); + var extractZone = (date) => + date + .toLocaleTimeString(undefined, { + hour12: false, + timeZoneName: 'short', + }) + .split(' ')[1]; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + if (summerOffset < winterOffset) { + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var _emscripten_date_now = () => Date.now(); + + var getHeapMax = () => 2147483648; + + var _emscripten_get_heap_max = () => getHeapMax(); + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + runtimeKeepaliveCounter -= 1; + }; + + /** @param {number=} timeout */ var safeSetTimeout = (func, timeout) => { + runtimeKeepalivePush(); + return setTimeout(() => { + runtimeKeepalivePop(); + callUserCallback(func); + }, timeout); + }; + + var _emscripten_sleep = (ms) => + Asyncify.handleSleep((wakeUp) => safeSetTimeout(wakeUp, ms)); + + Module['_emscripten_sleep'] = _emscripten_sleep; + + _emscripten_sleep.isAsync = true; + + var ENV = PHPLoader.ENV || {}; + + var getExecutableName = () => thisProgram || './this.program'; + + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == 'object' && + navigator.languages && + navigator.languages[0]) || + '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; + }; + + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = 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; + } + } + + function _fd_fdstat_get(fd, pbuf) { + try { + var rightsBase = 0; + var rightsInheriting = 0; + var flags = 0; + { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + } + HEAP8[pbuf] = type; + HEAP16[(pbuf + 2) >> 1] = flags; + (tempI64 = [ + rightsBase >>> 0, + ((tempDouble = rightsBase), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 8) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 12) >> 2] = tempI64[1]); + (tempI64 = [ + rightsInheriting >>> 0, + ((tempDouble = rightsInheriting), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[(pbuf + 16) >> 2] = tempI64[0]), + (HEAP32[(pbuf + 20) >> 2] = tempI64[1]); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ var doReadv = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? +Math.floor(tempDouble / 4294967296) >>> 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / + 4294967296 + ) >>> 0 + : 0), + ]), + (HEAP32[newOffset >> 2] = tempI64[0]), + (HEAP32[(newOffset + 4) >> 2] = tempI64[1]); + 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 _fd_sync = function (fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return Asyncify.handleSleep((wakeUp) => { + var mount = stream.node.mount; + if (!mount.type.syncfs) { + wakeUp(0); + return; + } + mount.type.syncfs(mount, false, (err) => { + if (err) { + wakeUp(29); + return; + } + wakeUp(0); + }); + }); + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + }; + + _fd_sync.isAsync = true; + + /** @param {number=} offset */ var doWritev = ( + stream, + iov, + iovcnt, + offset + ) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[pnum >> 2] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + var _getaddrinfo = (node, service, hint, out) => { + var addr = 0; + var port = 0; + var flags = 0; + var family = 0; + var type = 0; + var proto = 0; + var ai; + function allocaddrinfo(family, type, proto, canon, addr, port) { + var sa, salen, ai; + var errno; + salen = family === 10 ? 28 : 16; + addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr); + sa = _malloc(salen); + errno = writeSockaddr(sa, family, addr, port); + assert(!errno); + ai = _malloc(32); + HEAP32[(ai + 4) >> 2] = family; + HEAP32[(ai + 8) >> 2] = type; + HEAP32[(ai + 12) >> 2] = proto; + HEAPU32[(ai + 24) >> 2] = canon; + HEAPU32[(ai + 20) >> 2] = sa; + if (family === 10) { + HEAP32[(ai + 16) >> 2] = 28; + } else { + HEAP32[(ai + 16) >> 2] = 16; + } + HEAP32[(ai + 28) >> 2] = 0; + return ai; + } + if (hint) { + flags = HEAP32[hint >> 2]; + family = HEAP32[(hint + 4) >> 2]; + type = HEAP32[(hint + 8) >> 2]; + proto = HEAP32[(hint + 12) >> 2]; + } + if (type && !proto) { + proto = type === 2 ? 17 : 6; + } + if (!type && proto) { + type = proto === 17 ? 2 : 1; + } + if (proto === 0) { + proto = 6; + } + if (type === 0) { + type = 1; + } + if (!node && !service) { + return -2; + } + if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) { + return -1; + } + if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) { + return -1; + } + if (flags & 32) { + return -2; + } + if (type !== 0 && type !== 1 && type !== 2) { + return -7; + } + if (family !== 0 && family !== 2 && family !== 10) { + return -6; + } + if (service) { + service = UTF8ToString(service); + port = parseInt(service, 10); + if (isNaN(port)) { + if (flags & 1024) { + return -2; + } + return -8; + } + } + if (!node) { + if (family === 0) { + family = 2; + } + if ((flags & 1) === 0) { + if (family === 2) { + addr = _htonl(2130706433); + } else { + addr = [0, 0, 0, 1]; + } + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + node = UTF8ToString(node); + addr = inetPton4(node); + if (addr !== null) { + if (family === 0 || family === 2) { + family = 2; + } else if (family === 10 && flags & 8) { + addr = [0, 0, _htonl(65535), addr]; + family = 10; + } else { + return -2; + } + } else { + addr = inetPton6(node); + if (addr !== null) { + if (family === 0 || family === 10) { + family = 10; + } else { + return -2; + } + } + } + if (addr != null) { + ai = allocaddrinfo(family, type, proto, node, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + } + if (flags & 4) { + return -2; + } + node = DNS.lookup_name(node); + addr = inetPton4(node); + if (family === 0) { + family = 2; + } else if (family === 10) { + addr = [0, 0, _htonl(65535), addr]; + } + ai = allocaddrinfo(family, type, proto, null, addr, port); + HEAPU32[out >> 2] = ai; + return 0; + }; + + /** @type {function(...*):?} */ function _getcontext() { + abort('missing function: getcontext'); + } + + _getcontext.stub = true; + + /** @type {function(...*):?} */ function _getdtablesize() { + abort('missing function: getdtablesize'); + } + + _getdtablesize.stub = true; + + var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => { + var info = readSockaddr(sa, salen); + if (info.errno) { + return -6; + } + var port = info.port; + var addr = info.addr; + var overflowed = false; + if (node && nodelen) { + var lookup; + if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) { + if (flags & 8) { + return -2; + } + } else { + addr = lookup; + } + var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen); + if (numBytesWrittenExclNull + 1 >= nodelen) { + overflowed = true; + } + } + if (serv && servlen) { + port = '' + port; + var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen); + if (numBytesWrittenExclNull + 1 >= servlen) { + overflowed = true; + } + } + if (overflowed) { + return -12; + } + return 0; + }; + + var Protocols = { + list: [], + map: {}, + }; + + var _setprotoent = (stayopen) => { + function allocprotoent(name, proto, aliases) { + var nameBuf = _malloc(name.length + 1); + stringToAscii(name, nameBuf); + var j = 0; + var length = aliases.length; + var aliasListBuf = _malloc((length + 1) * 4); + for (var i = 0; i < length; i++, j += 4) { + var alias = aliases[i]; + var aliasBuf = _malloc(alias.length + 1); + stringToAscii(alias, aliasBuf); + HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf; + } + HEAPU32[(aliasListBuf + j) >> 2] = 0; + var pe = _malloc(12); + HEAPU32[pe >> 2] = nameBuf; + HEAPU32[(pe + 4) >> 2] = aliasListBuf; + HEAP32[(pe + 8) >> 2] = proto; + return pe; + } + var list = Protocols.list; + var map = Protocols.map; + if (list.length === 0) { + var entry = allocprotoent('tcp', 6, ['TCP']); + list.push(entry); + map['tcp'] = map['6'] = entry; + entry = allocprotoent('udp', 17, ['UDP']); + list.push(entry); + map['udp'] = map['17'] = entry; + } + _setprotoent.index = 0; + }; + + var _getprotobyname = (name) => { + name = UTF8ToString(name); + _setprotoent(true); + var result = Protocols.map[name]; + return result; + }; + + var _getprotobynumber = (number) => { + _setprotoent(true); + var result = Protocols.map[number]; + return result; + }; + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + + /** @suppress {duplicate } */ var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + var allocateUTF8OnStack = stringToUTF8OnStack; + + var PHPWASM = { + init: function () { + FS.mkdir('/internal'); + FS.mkdir('/internal/shared'); + FS.mkdir('/internal/shared/preload'); + PHPWASM.EventEmitter = ENVIRONMENT_IS_NODE + ? require('events').EventEmitter + : class EventEmitter { + constructor() { + this.listeners = {}; + } + emit(eventName, data) { + if (this.listeners[eventName]) { + this.listeners[eventName].forEach( + (callback) => { + callback(data); + } + ); + } + } + once(eventName, callback) { + const self = this; + function removedCallback() { + callback(...arguments); + self.removeListener(eventName, removedCallback); + } + this.on(eventName, removedCallback); + } + removeAllListeners(eventName) { + if (eventName) { + delete this.listeners[eventName]; + } else { + this.listeners = {}; + } + } + removeListener(eventName, callback) { + if (this.listeners[eventName]) { + const idx = + this.listeners[eventName].indexOf(callback); + if (idx !== -1) { + this.listeners[eventName].splice(idx, 1); + } + } + } + }; + PHPWASM.child_proc_by_fd = {}; + PHPWASM.child_proc_by_pid = {}; + PHPWASM.input_devices = {}; + }, + getAllWebSockets: function (sock) { + const webSockets = new Set(); + if (sock.server) { + sock.server.clients.forEach((ws) => { + webSockets.add(ws); + }); + } + for (const peer of PHPWASM.getAllPeers(sock)) { + webSockets.add(peer.socket); + } + return Array.from(webSockets); + }, + getAllPeers: function (sock) { + const peers = new Set(); + if (sock.server) { + sock.pending + .filter((pending) => pending.peers) + .forEach((pending) => { + for (const peer of Object.values(pending.peers)) { + peers.add(peer); + } + }); + } + if (sock.peers) { + for (const peer of Object.values(sock.peers)) { + peers.add(peer); + } + } + return Array.from(peers); + }, + awaitData: function (ws) { + return PHPWASM.awaitEvent(ws, 'message'); + }, + awaitConnection: function (ws) { + if (ws.OPEN === ws.readyState) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'open'); + }, + awaitClose: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'close'); + }, + awaitError: function (ws) { + if ([ws.CLOSING, ws.CLOSED].includes(ws.readyState)) { + return [Promise.resolve(), PHPWASM.noop]; + } + return PHPWASM.awaitEvent(ws, 'error'); + }, + awaitEvent: function (ws, event) { + let resolve; + const listener = () => { + resolve(); + }; + const promise = new Promise(function (_resolve) { + resolve = _resolve; + ws.once(event, listener); + }); + const cancel = () => { + ws.removeListener(event, listener); + setTimeout(resolve); + }; + return [promise, cancel]; + }, + noop: function () {}, + spawnProcess: function (command, args, options) { + if (Module['spawnProcess']) { + const spawnedPromise = Module['spawnProcess']( + command, + args, + options + ); + return Promise.resolve(spawnedPromise).then(function (spawned) { + if (!spawned || !spawned.on) { + throw new Error( + 'spawnProcess() must return an EventEmitter but returned a different type.' + ); + } + return spawned; + }); + } + if (ENVIRONMENT_IS_NODE) { + return require('child_process').spawn(command, args, { + ...options, + shell: true, + stdio: ['pipe', 'pipe', 'pipe'], + timeout: 100, + }); + } + const e = new Error( + 'popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() ' + + 'and provide a callback to handle spawning processes, or disable a popen(), proc_open() ' + + 'and similar functions via php.ini.' + ); + e.code = 'SPAWN_UNSUPPORTED'; + throw e; + }, + shutdownSocket: function (socketd, how) { + const sock = getSocketFromFD(socketd); + const peer = Object.values(sock.peers)[0]; + if (!peer) { + return -1; + } + try { + peer.socket.close(); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + return 0; + } catch (e) { + console.log('Socket shutdown error', e); + return -1; + } + }, + }; + + function _js_create_input_device(deviceId) { + let dataBuffer = []; + let dataCallback; + const filename = 'proc_id_' + deviceId; + const device = FS.createDevice( + '/dev', + filename, + function () {}, + function (byte) { + try { + dataBuffer.push(byte); + if (dataCallback) { + dataCallback(new Uint8Array(dataBuffer)); + dataBuffer = []; + } + } catch (e) { + console.error(e); + throw e; + } + } + ); + const devicePath = '/dev/' + filename; + PHPWASM.input_devices[deviceId] = { + devicePath: devicePath, + onData: function (cb) { + dataCallback = cb; + dataBuffer.forEach(function (data) { + cb(data); + }); + dataBuffer.length = 0; + }, + }; + return allocateUTF8OnStack(devicePath); + } + + function _js_open_process( + command, + argsPtr, + argsLength, + descriptorsPtr, + descriptorsLength, + cwdPtr, + cwdLength, + envPtr, + envLength + ) { + if (!command) { + return 1; + } + const cmdstr = UTF8ToString(command); + if (!cmdstr.length) { + return 0; + } + let argsArray = []; + if (argsLength) { + for (var i = 0; i < argsLength; i++) { + const charPointer = argsPtr + i * 4; + argsArray.push(UTF8ToString(HEAPU32[charPointer >> 2])); + } + } + const cwdstr = cwdPtr ? UTF8ToString(cwdPtr) : null; + let envObject = null; + if (envLength) { + envObject = {}; + for (var i = 0; i < envLength; i++) { + const envPointer = envPtr + i * 4; + const envEntry = UTF8ToString(HEAPU32[envPointer >> 2]); + const splitAt = envEntry.indexOf('='); + if (splitAt === -1) { + continue; + } + const key = envEntry.substring(0, splitAt); + const value = envEntry.substring(splitAt + 1); + envObject[key] = value; + } + } + var std = {}; + for (var i = 0; i < descriptorsLength; i++) { + const descriptorPtr = HEAPU32[(descriptorsPtr + i * 4) >> 2]; + std[HEAPU32[descriptorPtr >> 2]] = { + child: HEAPU32[(descriptorPtr + 4) >> 2], + parent: HEAPU32[(descriptorPtr + 8) >> 2], + }; + } + return Asyncify.handleSleep(async (wakeUp) => { + let cp; + try { + const options = {}; + if (cwdstr !== null) { + options.cwd = cwdstr; + } + if (envObject !== null) { + options.env = envObject; + } + cp = PHPWASM.spawnProcess(cmdstr, argsArray, options); + if (cp instanceof Promise) { + cp = await cp; + } + } catch (e) { + if (e.code === 'SPAWN_UNSUPPORTED') { + wakeUp(1); + return; + } + console.error(e); + wakeUp(1); + throw e; + } + const ProcInfo = { + pid: cp.pid, + exited: false, + stdinFd: std[0]?.child, + stdinIsDevice: std[0]?.child in PHPWASM.input_devices, + stdoutChildFd: std[1]?.child, + stdoutParentFd: std[1]?.parent, + stderrChildFd: std[2]?.child, + stderrParentFd: std[2]?.parent, + stdout: new PHPWASM.EventEmitter(), + stderr: new PHPWASM.EventEmitter(), + }; + if (ProcInfo.stdoutChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd] = ProcInfo; + if (ProcInfo.stderrChildFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd] = ProcInfo; + if (ProcInfo.stdoutParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd] = ProcInfo; + if (ProcInfo.stderrParentFd) + PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd] = ProcInfo; + PHPWASM.child_proc_by_pid[ProcInfo.pid] = ProcInfo; + cp.on('exit', function (code) { + ProcInfo.exitCode = code; + ProcInfo.exited = true; + ProcInfo.stdout.emit('data'); + ProcInfo.stderr.emit('data'); + }); + if (ProcInfo.stdoutChildFd) { + const stdoutStream = SYSCALLS.getStreamFromFD( + ProcInfo.stdoutChildFd + ); + let stdoutAt = 0; + cp.stdout.on('data', function (data) { + ProcInfo.stdout.emit('data', data); + stdoutStream.stream_ops.write( + stdoutStream, + data, + 0, + data.length, + stdoutAt + ); + stdoutAt += data.length; + }); + } + if (ProcInfo.stderrChildFd) { + const stderrStream = SYSCALLS.getStreamFromFD( + ProcInfo.stderrChildFd + ); + let stderrAt = 0; + cp.stderr.on('data', function (data) { + ProcInfo.stderr.emit('data', data); + stderrStream.stream_ops.write( + stderrStream, + data, + 0, + data.length, + stderrAt + ); + stderrAt += data.length; + }); + } + /** + * Wait until the child process has been spawned. + * Unfortunately there is no Node.js API to check whether + * the process has already been spawned. We can only listen + * to the 'spawn' event and if it has already been spawned, + * listen to the 'exit' event. + */ try { + await new Promise((resolve, reject) => { + cp.on('spawn', resolve); + cp.on('error', reject); + }); + } catch (e) { + console.error(e); + wakeUp(1); + return; + } + if (ProcInfo.stdinIsDevice) { + PHPWASM.input_devices[ProcInfo.stdinFd].onData(function (data) { + if (!data) return; + if (typeof data === 'number') { + data = new Uint8Array([data]); + } + const dataStr = new TextDecoder('utf-8').decode(data); + cp.stdin.write(dataStr); + }); + wakeUp(ProcInfo.pid); + return; + } + if (ProcInfo.stdinFd) { + const stdinStream = SYSCALLS.getStreamFromFD(ProcInfo.stdinFd); + if (stdinStream.node) { + const CHUNK_SIZE = 1024; + const buffer = new Uint8Array(CHUNK_SIZE); + let offset = 0; + while (true) { + const bytesRead = stdinStream.stream_ops.read( + stdinStream, + buffer, + 0, + CHUNK_SIZE, + offset + ); + if (bytesRead === null || bytesRead === 0) { + break; + } + try { + cp.stdin.write(buffer.subarray(0, bytesRead)); + } catch (e) { + console.error(e); + return 1; + } + if (bytesRead < CHUNK_SIZE) { + break; + } + offset += bytesRead; + } + wakeUp(ProcInfo.pid); + return; + } + } + wakeUp(ProcInfo.pid); + }); + } + + function _js_process_status(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + if (PHPWASM.child_proc_by_pid[pid].exited) { + HEAPU32[exitCodePtr >> 2] = PHPWASM.child_proc_by_pid[pid].exitCode; + return 1; + } + return 0; + } + + function _js_waitpid(pid, exitCodePtr) { + if (!PHPWASM.child_proc_by_pid[pid]) { + return -1; + } + return Asyncify.handleSleep((wakeUp) => { + const poll = function () { + if (PHPWASM.child_proc_by_pid[pid]?.exited) { + HEAPU32[exitCodePtr >> 2] = + PHPWASM.child_proc_by_pid[pid].exitCode; + wakeUp(pid); + } else { + setTimeout(poll, 50); + } + }; + poll(); + }); + } + + /** @type {function(...*):?} */ function _makecontext() { + abort('missing function: makecontext'); + } + + _makecontext.stub = true; + + var arraySum = (array, index) => { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) {} + return sum; + }; + + var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + var addDays = (date, days) => { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = ( + leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR + )[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + }; + + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + + var _strftime = (s, maxsize, format, tm) => { + var tm_zone = HEAPU32[(tm + 40) >> 2]; + var date = { + tm_sec: HEAP32[tm >> 2], + tm_min: HEAP32[(tm + 4) >> 2], + tm_hour: HEAP32[(tm + 8) >> 2], + tm_mday: HEAP32[(tm + 12) >> 2], + tm_mon: HEAP32[(tm + 16) >> 2], + tm_year: HEAP32[(tm + 20) >> 2], + tm_wday: HEAP32[(tm + 24) >> 2], + tm_yday: HEAP32[(tm + 28) >> 2], + tm_isdst: HEAP32[(tm + 32) >> 2], + tm_gmtoff: HEAP32[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '', + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', + '%D': '%m/%d/%y', + '%F': '%Y-%m-%d', + '%h': '%b', + '%r': '%I:%M:%S %p', + '%R': '%H:%M', + '%T': '%H:%M:%S', + '%x': '%m/%d/%y', + '%X': '%H:%M:%S', + '%Ec': '%c', + '%EC': '%C', + '%Ex': '%m/%d/%y', + '%EX': '%H:%M:%S', + '%Ey': '%y', + '%EY': '%Y', + '%Od': '%d', + '%Oe': '%e', + '%OH': '%H', + '%OI': '%I', + '%Om': '%m', + '%OM': '%M', + '%OS': '%S', + '%Ou': '%u', + '%OU': '%U', + '%OV': '%V', + '%Ow': '%w', + '%OW': '%W', + '%Oy': '%y', + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_1[rule] + ); + } + var WEEKDAYS = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + var MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : value || ''; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ( + (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0 + ) { + if ( + (compare = sgn(date1.getMonth() - date2.getMonth())) === 0 + ) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + + case 1: + return janFourth; + + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = addDays( + new Date(date.tm_year + 1900, 0, 1), + date.tm_yday + ); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = + getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = + getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear() - 1; + } + var EXPANSION_RULES_2 = { + '%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3), + '%A': (date) => WEEKDAYS[date.tm_wday], + '%b': (date) => MONTHS[date.tm_mon].substring(0, 3), + '%B': (date) => MONTHS[date.tm_mon], + '%C': (date) => { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + '%d': (date) => leadingNulls(date.tm_mday, 2), + '%e': (date) => leadingSomething(date.tm_mday, 2, ' '), + '%g': (date) => getWeekBasedYear(date).toString().substring(2), + '%G': getWeekBasedYear, + '%H': (date) => leadingNulls(date.tm_hour, 2), + '%I': (date) => { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': (date) => + leadingNulls( + date.tm_mday + + arraySum( + isLeapYear(date.tm_year + 1900) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + date.tm_mon - 1 + ), + 3 + ), + '%m': (date) => leadingNulls(date.tm_mon + 1, 2), + '%M': (date) => leadingNulls(date.tm_min, 2), + '%n': () => '\n', + '%p': (date) => { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': (date) => leadingNulls(date.tm_sec, 2), + '%t': () => '\t', + '%u': (date) => date.tm_wday || 7, + '%U': (date) => { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': (date) => { + var val = Math.floor( + (date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7 + ); + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if ( + dec31 == 4 || + (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1)) + ) { + val++; + } + } else if (val == 53) { + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': (date) => date.tm_wday, + '%W': (date) => { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': (date) => (date.tm_year + 1900).toString().substring(2), + '%Y': (date) => date.tm_year + 1900, + '%z': (date) => { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? '+' : '-') + String('0000' + off).slice(-4); + }, + '%Z': (date) => date.tm_zone, + '%%': () => '%', + }; + pattern = pattern.replace(/%%/g, '\0\0'); + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace( + new RegExp(rule, 'g'), + EXPANSION_RULES_2[rule](date) + ); + } + } + pattern = pattern.replace(/\0\0/g, '%'); + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + }; + + var _strftime_l = (s, maxsize, format, tm, loc) => + _strftime(s, maxsize, format, tm); + + var _strptime = (buf, format, tm) => { + var pattern = UTF8ToString(format); + var SPECIAL_CHARS = '\\!@#$^&*()+=-[]/{}|:<>?,.'; + for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) { + pattern = pattern.replace( + new RegExp('\\' + SPECIAL_CHARS[i], 'g'), + '\\' + SPECIAL_CHARS[i] + ); + } + var EQUIVALENT_MATCHERS = { + A: '%a', + B: '%b', + c: '%a %b %d %H:%M:%S %Y', + D: '%m\\/%d\\/%y', + e: '%d', + F: '%Y-%m-%d', + h: '%b', + R: '%H\\:%M', + r: '%I\\:%M\\:%S\\s%p', + T: '%H\\:%M\\:%S', + x: '%m\\/%d\\/(?:%y|%Y)', + X: '%H\\:%M\\:%S', + }; + var DATE_PATTERNS = { + /* weekday name */ a: '(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)', + /* month name */ b: '(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)', + /* century */ C: '\\d\\d', + /* day of month */ d: '0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31', + /* hour (24hr) */ H: '\\d(?!\\d)|[0,1]\\d|20|21|22|23', + /* hour (12hr) */ I: '\\d(?!\\d)|0\\d|10|11|12', + /* day of year */ j: '00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d', + /* month */ m: '0[1-9]|[1-9](?!\\d)|10|11|12', + /* minutes */ M: '0\\d|\\d(?!\\d)|[1-5]\\d', + /* whitespace */ n: ' ', + /* AM/PM */ p: 'AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.', + /* seconds */ S: '0\\d|\\d(?!\\d)|[1-5]\\d|60', + /* week number */ U: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* week number */ W: '0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53', + /* weekday number */ w: '[0-6]', + /* 2-digit year */ y: '\\d\\d', + /* 4-digit year */ Y: '\\d\\d\\d\\d', + /* whitespace */ t: ' ', + /* time zone */ z: 'Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)', + }; + var MONTH_NUMBERS = { + JAN: 0, + FEB: 1, + MAR: 2, + APR: 3, + MAY: 4, + JUN: 5, + JUL: 6, + AUG: 7, + SEP: 8, + OCT: 9, + NOV: 10, + DEC: 11, + }; + var DAY_NUMBERS_SUN_FIRST = { + SUN: 0, + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + }; + var DAY_NUMBERS_MON_FIRST = { + MON: 0, + TUE: 1, + WED: 2, + THU: 3, + FRI: 4, + SAT: 5, + SUN: 6, + }; + var capture = []; + var pattern_out = pattern + .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m) + .replace(/%(.)/g, (_, c) => { + let pat = DATE_PATTERNS[c]; + if (pat) { + capture.push(c); + return `(${pat})`; + } else { + return c; + } + }) + .replace(/\s+/g, '\\s*'); + var matches = new RegExp('^' + pattern_out, 'i').exec( + UTF8ToString(buf) + ); + function initDate() { + function fixup(value, min, max) { + return typeof value != 'number' || isNaN(value) + ? min + : value >= min + ? value <= max + ? value + : max + : min; + } + return { + year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999), + month: fixup(HEAP32[(tm + 16) >> 2], 0, 11), + day: fixup(HEAP32[(tm + 12) >> 2], 1, 31), + hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23), + min: fixup(HEAP32[(tm + 4) >> 2], 0, 59), + sec: fixup(HEAP32[tm >> 2], 0, 59), + gmtoff: 0, + }; + } + if (matches) { + var date = initDate(); + var value; + var getMatch = (symbol) => { + var pos = capture.indexOf(symbol); + if (pos >= 0) { + return matches[pos + 1]; + } + return; + }; + if ((value = getMatch('S'))) { + date.sec = jstoi_q(value); + } + if ((value = getMatch('M'))) { + date.min = jstoi_q(value); + } + if ((value = getMatch('H'))) { + date.hour = jstoi_q(value); + } else if ((value = getMatch('I'))) { + var hour = jstoi_q(value); + if ((value = getMatch('p'))) { + hour += value.toUpperCase()[0] === 'P' ? 12 : 0; + } + date.hour = hour; + } + if ((value = getMatch('Y'))) { + date.year = jstoi_q(value); + } else if ((value = getMatch('y'))) { + var year = jstoi_q(value); + if ((value = getMatch('C'))) { + year += jstoi_q(value) * 100; + } else { + year += year < 69 ? 2e3 : 1900; + } + date.year = year; + } + if ((value = getMatch('m'))) { + date.month = jstoi_q(value) - 1; + } else if ((value = getMatch('b'))) { + date.month = + MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0; + } + if ((value = getMatch('d'))) { + date.day = jstoi_q(value); + } else if ((value = getMatch('j'))) { + var day = jstoi_q(value); + var leapYear = isLeapYear(date.year); + for (var month = 0; month < 12; ++month) { + var daysUntilMonth = arraySum( + leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, + month - 1 + ); + if ( + day <= + daysUntilMonth + + (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[ + month + ] + ) { + date.day = day - daysUntilMonth; + } + } + } else if ((value = getMatch('a'))) { + var weekDay = value.substring(0, 3).toUpperCase(); + if ((value = getMatch('U'))) { + var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 0) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } else if ((value = getMatch('W'))) { + var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay]; + var weekNumber = jstoi_q(value); + var janFirst = new Date(date.year, 0, 1); + var endDate; + if (janFirst.getDay() === 1) { + endDate = addDays( + janFirst, + weekDayNumber + 7 * (weekNumber - 1) + ); + } else { + endDate = addDays( + janFirst, + 7 - + janFirst.getDay() + + 1 + + weekDayNumber + + 7 * (weekNumber - 1) + ); + } + date.day = endDate.getDate(); + date.month = endDate.getMonth(); + } + } + if ((value = getMatch('z'))) { + if (value.toLowerCase() === 'z') { + date.gmtoff = 0; + } else { + var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/); + date.gmtoff = match[1] * 3600; + if (match[2]) { + date.gmtoff += + date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60; + } + } + } + /* tm_sec int seconds after the minute 0-61* tm_min int minutes after the hour 0-59 tm_hour int hours since midnight 0-23 @@ -6700,503 +7759,614 @@ var _strptime = (buf, format, tm) => { tm_yday int days since January 1 0-365 tm_isdst int Daylight Saving Time flag tm_gmtoff long offset from GMT (seconds) - */ var fullDate = new Date(date.year, date.month, date.day, date.hour, date.min, date.sec, 0); - HEAP32[((tm) >> 2)] = fullDate.getSeconds(); - HEAP32[(((tm) + (4)) >> 2)] = fullDate.getMinutes(); - HEAP32[(((tm) + (8)) >> 2)] = fullDate.getHours(); - HEAP32[(((tm) + (12)) >> 2)] = fullDate.getDate(); - HEAP32[(((tm) + (16)) >> 2)] = fullDate.getMonth(); - HEAP32[(((tm) + (20)) >> 2)] = fullDate.getFullYear() - 1900; - HEAP32[(((tm) + (24)) >> 2)] = fullDate.getDay(); - HEAP32[(((tm) + (28)) >> 2)] = arraySum(isLeapYear(fullDate.getFullYear()) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, fullDate.getMonth() - 1) + fullDate.getDate() - 1; - HEAP32[(((tm) + (32)) >> 2)] = 0; - HEAP32[(((tm) + (36)) >> 2)] = date.gmtoff; - return buf + intArrayFromString(matches[0]).length - 1; - } - return 0; -}; - -/** @type {function(...*):?} */ function _swapcontext() { - abort("missing function: swapcontext"); -} - -_swapcontext.stub = true; - -function _wasm_close(socketd) { - return PHPWASM.shutdownSocket(socketd, 2); -} - -function _wasm_setsockopt(socketd, level, optionName, optionValuePtr, optionLen) { - const optionValue = HEAPU8[optionValuePtr]; - const SOL_SOCKET = 1; - const SO_KEEPALIVE = 9; - const IPPROTO_TCP = 6; - const TCP_NODELAY = 1; - const isSupported = (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || (level === IPPROTO_TCP && optionName === TCP_NODELAY); - if (!isSupported) { - console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`); - return -1; - } - const ws = PHPWASM.getAllWebSockets(socketd)[0]; - if (!ws) { - return -1; - } - ws.setSocketOpt(level, optionName, optionValuePtr); - return 0; -} - -function _wasm_shutdown(socketd, how) { - return PHPWASM.shutdownSocket(socketd, how); -} - -var Asyncify = { - instrumentWasmImports(imports) { - var importPattern = /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; - for (let [x, original] of Object.entries(imports)) { - if (typeof original == "function") { - let isAsyncifyImport = original.isAsync || importPattern.test(x); - if (isAsyncifyImport) { - imports[x] = original = new WebAssembly.Suspending(original); - } - } - } - }, - instrumentWasmExports(exports) { - var exportPattern = /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; - Asyncify.asyncExports = new Set; - var ret = {}; - for (let [x, original] of Object.entries(exports)) { - if (typeof original == "function") { - let isAsyncifyExport = exportPattern.test(x); - if (isAsyncifyExport) { - Asyncify.asyncExports.add(original); - original = Asyncify.makeAsyncFunction(original); - } - ret[x] = (...args) => original(...args); - } else { - ret[x] = original; - } - } - return ret; - }, - asyncExports: null, - isAsyncExport(func) { - return Asyncify.asyncExports?.has(func); - }, - handleAsync: async startAsync => { - runtimeKeepalivePush(); - try { - return await startAsync(); - } finally { - runtimeKeepalivePop(); - } - }, - handleSleep(startAsync) { - return Asyncify.handleAsync(() => new Promise(startAsync)); - }, - makeAsyncFunction(original) { - return WebAssembly.promising(original); - } -}; - -var getCFunc = ident => { - var func = Module["_" + ident]; - return func; -}; - -var stackSave = () => _emscripten_stack_get_current(); - -var stackRestore = val => __emscripten_stack_restore(val); - -/** - * @param {string|null=} returnType - * @param {Array=} argTypes - * @param {Arguments|Array=} args - * @param {Object=} opts - */ 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 === "boolean") return Boolean(ret); - return ret; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func(...cArgs); - function onDone(ret) { - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - var asyncMode = opts?.async; - if (asyncMode) return ret.then(onDone); - ret = onDone(ret); - return ret; -}; - -var FS_createPath = FS.createPath; - -var FS_unlink = path => FS.unlink(path); - -var FS_createLazyFile = FS.createLazyFile; - -var FS_createDevice = FS.createDevice; - -FS.createPreloadedFile = FS_createPreloadedFile; - -FS.staticInit(); - -Module["FS_createPath"] = FS.createPath; - -Module["FS_createDataFile"] = FS.createDataFile; - -Module["FS_createPreloadedFile"] = FS.createPreloadedFile; - -Module["FS_unlink"] = FS.unlink; - -Module["FS_createLazyFile"] = FS.createLazyFile; - -Module["FS_createDevice"] = FS.createDevice; - -if (ENVIRONMENT_IS_NODE) { - NODEFS.staticInit(); -} - -PHPWASM.init(); - -var wasmImports = { - /** @export */ SharpYuvConvert: _SharpYuvConvert, - /** @export */ SharpYuvGetConversionMatrix: _SharpYuvGetConversionMatrix, - /** @export */ SharpYuvInit: _SharpYuvInit, - /** @export */ __assert_fail: ___assert_fail, - /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, - /** @export */ __asyncjs__js_module_onMessage: __asyncjs__js_module_onMessage, - /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, - /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, - /** @export */ __call_sighandler: ___call_sighandler, - /** @export */ __syscall_accept4: ___syscall_accept4, - /** @export */ __syscall_bind: ___syscall_bind, - /** @export */ __syscall_chdir: ___syscall_chdir, - /** @export */ __syscall_chmod: ___syscall_chmod, - /** @export */ __syscall_connect: ___syscall_connect, - /** @export */ __syscall_dup: ___syscall_dup, - /** @export */ __syscall_dup3: ___syscall_dup3, - /** @export */ __syscall_faccessat: ___syscall_faccessat, - /** @export */ __syscall_fallocate: ___syscall_fallocate, - /** @export */ __syscall_fchmod: ___syscall_fchmod, - /** @export */ __syscall_fchown32: ___syscall_fchown32, - /** @export */ __syscall_fchownat: ___syscall_fchownat, - /** @export */ __syscall_fcntl64: ___syscall_fcntl64, - /** @export */ __syscall_fdatasync: ___syscall_fdatasync, - /** @export */ __syscall_fstat64: ___syscall_fstat64, - /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, - /** @export */ __syscall_getcwd: ___syscall_getcwd, - /** @export */ __syscall_getdents64: ___syscall_getdents64, - /** @export */ __syscall_getpeername: ___syscall_getpeername, - /** @export */ __syscall_getsockname: ___syscall_getsockname, - /** @export */ __syscall_getsockopt: ___syscall_getsockopt, - /** @export */ __syscall_ioctl: ___syscall_ioctl, - /** @export */ __syscall_listen: ___syscall_listen, - /** @export */ __syscall_lstat64: ___syscall_lstat64, - /** @export */ __syscall_mkdirat: ___syscall_mkdirat, - /** @export */ __syscall_newfstatat: ___syscall_newfstatat, - /** @export */ __syscall_openat: ___syscall_openat, - /** @export */ __syscall_pipe: ___syscall_pipe, - /** @export */ __syscall_poll: ___syscall_poll, - /** @export */ __syscall_readlinkat: ___syscall_readlinkat, - /** @export */ __syscall_recvfrom: ___syscall_recvfrom, - /** @export */ __syscall_renameat: ___syscall_renameat, - /** @export */ __syscall_rmdir: ___syscall_rmdir, - /** @export */ __syscall_sendto: ___syscall_sendto, - /** @export */ __syscall_socket: ___syscall_socket, - /** @export */ __syscall_stat64: ___syscall_stat64, - /** @export */ __syscall_statfs64: ___syscall_statfs64, - /** @export */ __syscall_symlink: ___syscall_symlink, - /** @export */ __syscall_unlinkat: ___syscall_unlinkat, - /** @export */ __syscall_utimensat: ___syscall_utimensat, - /** @export */ _abort_js: __abort_js, - /** @export */ _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic, - /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, - /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, - /** @export */ _emscripten_runtime_keepalive_clear: __emscripten_runtime_keepalive_clear, - /** @export */ _gmtime_js: __gmtime_js, - /** @export */ _localtime_js: __localtime_js, - /** @export */ _mktime_js: __mktime_js, - /** @export */ _mmap_js: __mmap_js, - /** @export */ _munmap_js: __munmap_js, - /** @export */ _setitimer_js: __setitimer_js, - /** @export */ _tzset_js: __tzset_js, - /** @export */ emscripten_date_now: _emscripten_date_now, - /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, - /** @export */ emscripten_get_now: _emscripten_get_now, - /** @export */ emscripten_resize_heap: _emscripten_resize_heap, - /** @export */ emscripten_sleep: _emscripten_sleep, - /** @export */ environ_get: _environ_get, - /** @export */ environ_sizes_get: _environ_sizes_get, - /** @export */ exit: _exit, - /** @export */ fd_close: _fd_close, - /** @export */ fd_fdstat_get: _fd_fdstat_get, - /** @export */ fd_read: _fd_read, - /** @export */ fd_seek: _fd_seek, - /** @export */ fd_sync: _fd_sync, - /** @export */ fd_write: _fd_write, - /** @export */ getaddrinfo: _getaddrinfo, - /** @export */ getcontext: _getcontext, - /** @export */ getdtablesize: _getdtablesize, - /** @export */ getnameinfo: _getnameinfo, - /** @export */ getprotobyname: _getprotobyname, - /** @export */ getprotobynumber: _getprotobynumber, - /** @export */ js_create_input_device: _js_create_input_device, - /** @export */ js_open_process: _js_open_process, - /** @export */ js_process_status: _js_process_status, - /** @export */ js_waitpid: _js_waitpid, - /** @export */ makecontext: _makecontext, - /** @export */ proc_exit: _proc_exit, - /** @export */ strftime: _strftime, - /** @export */ strftime_l: _strftime_l, - /** @export */ strptime: _strptime, - /** @export */ swapcontext: _swapcontext, - /** @export */ wasm_close: _wasm_close, - /** @export */ wasm_setsockopt: _wasm_setsockopt, - /** @export */ wasm_shutdown: _wasm_shutdown -}; - -var wasmExports = createWasm(); - -var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["__wasm_call_ctors"])(); - -var _malloc = a0 => (_malloc = wasmExports["malloc"])(a0); - -var _wasm_popen = Module["_wasm_popen"] = (a0, a1) => (_wasm_popen = Module["_wasm_popen"] = wasmExports["wasm_popen"])(a0, a1); - -var _wasm_php_exec = Module["_wasm_php_exec"] = (a0, a1, a2, a3) => (_wasm_php_exec = Module["_wasm_php_exec"] = wasmExports["wasm_php_exec"])(a0, a1, a2, a3); - -var _php_pollfd_for = Module["_php_pollfd_for"] = (a0, a1, a2) => (_php_pollfd_for = Module["_php_pollfd_for"] = wasmExports["php_pollfd_for"])(a0, a1, a2); - -var _htons = a0 => (_htons = wasmExports["htons"])(a0); - -var _ntohs = a0 => (_ntohs = wasmExports["ntohs"])(a0); - -var _htonl = a0 => (_htonl = wasmExports["htonl"])(a0); - -var _wasm_sleep = Module["_wasm_sleep"] = a0 => (_wasm_sleep = Module["_wasm_sleep"] = wasmExports["wasm_sleep"])(a0); - -var _fflush = a0 => (_fflush = wasmExports["fflush"])(a0); - -var _wasm_read = Module["_wasm_read"] = (a0, a1, a2) => (_wasm_read = Module["_wasm_read"] = wasmExports["wasm_read"])(a0, a1, a2); - -var ___wrap_select = Module["___wrap_select"] = (a0, a1, a2, a3, a4) => (___wrap_select = Module["___wrap_select"] = wasmExports["__wrap_select"])(a0, a1, a2, a3, a4); - -var _wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = a0 => (_wasm_add_cli_arg = Module["_wasm_add_cli_arg"] = wasmExports["wasm_add_cli_arg"])(a0); - -var _run_cli = Module["_run_cli"] = () => (_run_cli = Module["_run_cli"] = wasmExports["run_cli"])(); - -var _wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = a0 => (_wasm_set_sapi_name = Module["_wasm_set_sapi_name"] = wasmExports["wasm_set_sapi_name"])(a0); - -var _wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = a0 => (_wasm_set_phpini_path = Module["_wasm_set_phpini_path"] = wasmExports["wasm_set_phpini_path"])(a0); - -var _wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = (a0, a1) => (_wasm_add_SERVER_entry = Module["_wasm_add_SERVER_entry"] = wasmExports["wasm_add_SERVER_entry"])(a0, a1); - -var _wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = (a0, a1) => (_wasm_add_ENV_entry = Module["_wasm_add_ENV_entry"] = wasmExports["wasm_add_ENV_entry"])(a0, a1); - -var _wasm_set_query_string = Module["_wasm_set_query_string"] = a0 => (_wasm_set_query_string = Module["_wasm_set_query_string"] = wasmExports["wasm_set_query_string"])(a0); + */ var fullDate = new Date( + date.year, + date.month, + date.day, + date.hour, + date.min, + date.sec, + 0 + ); + HEAP32[tm >> 2] = fullDate.getSeconds(); + HEAP32[(tm + 4) >> 2] = fullDate.getMinutes(); + HEAP32[(tm + 8) >> 2] = fullDate.getHours(); + HEAP32[(tm + 12) >> 2] = fullDate.getDate(); + HEAP32[(tm + 16) >> 2] = fullDate.getMonth(); + HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900; + HEAP32[(tm + 24) >> 2] = fullDate.getDay(); + HEAP32[(tm + 28) >> 2] = + arraySum( + isLeapYear(fullDate.getFullYear()) + ? MONTH_DAYS_LEAP + : MONTH_DAYS_REGULAR, + fullDate.getMonth() - 1 + ) + + fullDate.getDate() - + 1; + HEAP32[(tm + 32) >> 2] = 0; + HEAP32[(tm + 36) >> 2] = date.gmtoff; + return buf + intArrayFromString(matches[0]).length - 1; + } + return 0; + }; + + /** @type {function(...*):?} */ function _swapcontext() { + abort('missing function: swapcontext'); + } + + _swapcontext.stub = true; + + function _wasm_close(socketd) { + return PHPWASM.shutdownSocket(socketd, 2); + } + + function _wasm_setsockopt( + socketd, + level, + optionName, + optionValuePtr, + optionLen + ) { + const optionValue = HEAPU8[optionValuePtr]; + const SOL_SOCKET = 1; + const SO_KEEPALIVE = 9; + const IPPROTO_TCP = 6; + const TCP_NODELAY = 1; + const isSupported = + (level === SOL_SOCKET && optionName === SO_KEEPALIVE) || + (level === IPPROTO_TCP && optionName === TCP_NODELAY); + if (!isSupported) { + console.warn( + `Unsupported socket option: ${level}, ${optionName}, ${optionValue}` + ); + return -1; + } + const ws = PHPWASM.getAllWebSockets(socketd)[0]; + if (!ws) { + return -1; + } + ws.setSocketOpt(level, optionName, optionValuePtr); + return 0; + } + + function _wasm_shutdown(socketd, how) { + return PHPWASM.shutdownSocket(socketd, how); + } + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = + /^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/; + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = + original.isAsync || importPattern.test(x); + if (isAsyncifyImport) { + imports[x] = original = new WebAssembly.Suspending( + original + ); + } + } + } + }, + instrumentWasmExports(exports) { + var exportPattern = + /^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/; + Asyncify.asyncExports = new Set(); + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + let isAsyncifyExport = exportPattern.test(x); + if (isAsyncifyExport) { + Asyncify.asyncExports.add(original); + original = Asyncify.makeAsyncFunction(original); + } + ret[x] = (...args) => original(...args); + } else { + ret[x] = original; + } + } + return ret; + }, + asyncExports: null, + isAsyncExport(func) { + return Asyncify.asyncExports?.has(func); + }, + handleAsync: async (startAsync) => { + runtimeKeepalivePush(); + try { + return await startAsync(); + } finally { + runtimeKeepalivePop(); + } + }, + handleSleep(startAsync) { + return Asyncify.handleAsync(() => new Promise(startAsync)); + }, + makeAsyncFunction(original) { + return WebAssembly.promising(original); + }, + }; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; + return func; + }; + + var stackSave = () => _emscripten_stack_get_current(); + + var stackRestore = (val) => __emscripten_stack_restore(val); + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ 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 === 'boolean') return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func(...cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + var asyncMode = opts?.async; + if (asyncMode) return ret.then(onDone); + ret = onDone(ret); + return ret; + }; + + var FS_createPath = FS.createPath; + + var FS_unlink = (path) => FS.unlink(path); + + var FS_createLazyFile = FS.createLazyFile; + + var FS_createDevice = FS.createDevice; + + FS.createPreloadedFile = FS_createPreloadedFile; + + FS.staticInit(); + + Module['FS_createPath'] = FS.createPath; + + Module['FS_createDataFile'] = FS.createDataFile; + + Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + Module['FS_unlink'] = FS.unlink; + + Module['FS_createLazyFile'] = FS.createLazyFile; + + Module['FS_createDevice'] = FS.createDevice; + + if (ENVIRONMENT_IS_NODE) { + NODEFS.staticInit(); + } + + PHPWASM.init(); + + var wasmImports = { + /** @export */ SharpYuvConvert: _SharpYuvConvert, + /** @export */ SharpYuvGetConversionMatrix: + _SharpYuvGetConversionMatrix, + /** @export */ SharpYuvInit: _SharpYuvInit, + /** @export */ __assert_fail: ___assert_fail, + /** @export */ __asyncjs__js_fd_read: __asyncjs__js_fd_read, + /** @export */ __asyncjs__js_module_onMessage: + __asyncjs__js_module_onMessage, + /** @export */ __asyncjs__js_popen_to_file: __asyncjs__js_popen_to_file, + /** @export */ __asyncjs__wasm_poll_socket: __asyncjs__wasm_poll_socket, + /** @export */ __call_sighandler: ___call_sighandler, + /** @export */ __syscall_accept4: ___syscall_accept4, + /** @export */ __syscall_bind: ___syscall_bind, + /** @export */ __syscall_chdir: ___syscall_chdir, + /** @export */ __syscall_chmod: ___syscall_chmod, + /** @export */ __syscall_connect: ___syscall_connect, + /** @export */ __syscall_dup: ___syscall_dup, + /** @export */ __syscall_dup3: ___syscall_dup3, + /** @export */ __syscall_faccessat: ___syscall_faccessat, + /** @export */ __syscall_fallocate: ___syscall_fallocate, + /** @export */ __syscall_fchmod: ___syscall_fchmod, + /** @export */ __syscall_fchown32: ___syscall_fchown32, + /** @export */ __syscall_fchownat: ___syscall_fchownat, + /** @export */ __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ __syscall_fdatasync: ___syscall_fdatasync, + /** @export */ __syscall_fstat64: ___syscall_fstat64, + /** @export */ __syscall_ftruncate64: ___syscall_ftruncate64, + /** @export */ __syscall_getcwd: ___syscall_getcwd, + /** @export */ __syscall_getdents64: ___syscall_getdents64, + /** @export */ __syscall_getpeername: ___syscall_getpeername, + /** @export */ __syscall_getsockname: ___syscall_getsockname, + /** @export */ __syscall_getsockopt: ___syscall_getsockopt, + /** @export */ __syscall_ioctl: ___syscall_ioctl, + /** @export */ __syscall_listen: ___syscall_listen, + /** @export */ __syscall_lstat64: ___syscall_lstat64, + /** @export */ __syscall_mkdirat: ___syscall_mkdirat, + /** @export */ __syscall_newfstatat: ___syscall_newfstatat, + /** @export */ __syscall_openat: ___syscall_openat, + /** @export */ __syscall_pipe: ___syscall_pipe, + /** @export */ __syscall_poll: ___syscall_poll, + /** @export */ __syscall_readlinkat: ___syscall_readlinkat, + /** @export */ __syscall_recvfrom: ___syscall_recvfrom, + /** @export */ __syscall_renameat: ___syscall_renameat, + /** @export */ __syscall_rmdir: ___syscall_rmdir, + /** @export */ __syscall_sendto: ___syscall_sendto, + /** @export */ __syscall_socket: ___syscall_socket, + /** @export */ __syscall_stat64: ___syscall_stat64, + /** @export */ __syscall_statfs64: ___syscall_statfs64, + /** @export */ __syscall_symlink: ___syscall_symlink, + /** @export */ __syscall_unlinkat: ___syscall_unlinkat, + /** @export */ __syscall_utimensat: ___syscall_utimensat, + /** @export */ _abort_js: __abort_js, + /** @export */ _emscripten_get_now_is_monotonic: + __emscripten_get_now_is_monotonic, + /** @export */ _emscripten_lookup_name: __emscripten_lookup_name, + /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, + /** @export */ _emscripten_runtime_keepalive_clear: + __emscripten_runtime_keepalive_clear, + /** @export */ _gmtime_js: __gmtime_js, + /** @export */ _localtime_js: __localtime_js, + /** @export */ _mktime_js: __mktime_js, + /** @export */ _mmap_js: __mmap_js, + /** @export */ _munmap_js: __munmap_js, + /** @export */ _setitimer_js: __setitimer_js, + /** @export */ _tzset_js: __tzset_js, + /** @export */ emscripten_date_now: _emscripten_date_now, + /** @export */ emscripten_get_heap_max: _emscripten_get_heap_max, + /** @export */ emscripten_get_now: _emscripten_get_now, + /** @export */ emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ emscripten_sleep: _emscripten_sleep, + /** @export */ environ_get: _environ_get, + /** @export */ environ_sizes_get: _environ_sizes_get, + /** @export */ exit: _exit, + /** @export */ fd_close: _fd_close, + /** @export */ fd_fdstat_get: _fd_fdstat_get, + /** @export */ fd_read: _fd_read, + /** @export */ fd_seek: _fd_seek, + /** @export */ fd_sync: _fd_sync, + /** @export */ fd_write: _fd_write, + /** @export */ getaddrinfo: _getaddrinfo, + /** @export */ getcontext: _getcontext, + /** @export */ getdtablesize: _getdtablesize, + /** @export */ getnameinfo: _getnameinfo, + /** @export */ getprotobyname: _getprotobyname, + /** @export */ getprotobynumber: _getprotobynumber, + /** @export */ js_create_input_device: _js_create_input_device, + /** @export */ js_open_process: _js_open_process, + /** @export */ js_process_status: _js_process_status, + /** @export */ js_waitpid: _js_waitpid, + /** @export */ makecontext: _makecontext, + /** @export */ proc_exit: _proc_exit, + /** @export */ strftime: _strftime, + /** @export */ strftime_l: _strftime_l, + /** @export */ strptime: _strptime, + /** @export */ swapcontext: _swapcontext, + /** @export */ wasm_close: _wasm_close, + /** @export */ wasm_setsockopt: _wasm_setsockopt, + /** @export */ wasm_shutdown: _wasm_shutdown, + }; + + var wasmExports = createWasm(); + + var ___wasm_call_ctors = () => + (___wasm_call_ctors = wasmExports['__wasm_call_ctors'])(); + + var _malloc = (a0) => (_malloc = wasmExports['malloc'])(a0); + + var _wasm_popen = (Module['_wasm_popen'] = (a0, a1) => + (_wasm_popen = Module['_wasm_popen'] = wasmExports['wasm_popen'])( + a0, + a1 + )); + + var _wasm_php_exec = (Module['_wasm_php_exec'] = (a0, a1, a2, a3) => + (_wasm_php_exec = Module['_wasm_php_exec'] = + wasmExports['wasm_php_exec'])(a0, a1, a2, a3)); + + var _php_pollfd_for = (Module['_php_pollfd_for'] = (a0, a1, a2) => + (_php_pollfd_for = Module['_php_pollfd_for'] = + wasmExports['php_pollfd_for'])(a0, a1, a2)); + + var _htons = (a0) => (_htons = wasmExports['htons'])(a0); + + var _ntohs = (a0) => (_ntohs = wasmExports['ntohs'])(a0); + + var _htonl = (a0) => (_htonl = wasmExports['htonl'])(a0); + + var _wasm_sleep = (Module['_wasm_sleep'] = (a0) => + (_wasm_sleep = Module['_wasm_sleep'] = wasmExports['wasm_sleep'])(a0)); + + var _fflush = (a0) => (_fflush = wasmExports['fflush'])(a0); + + var _wasm_read = (Module['_wasm_read'] = (a0, a1, a2) => + (_wasm_read = Module['_wasm_read'] = wasmExports['wasm_read'])( + a0, + a1, + a2 + )); + + var ___wrap_select = (Module['___wrap_select'] = (a0, a1, a2, a3, a4) => + (___wrap_select = Module['___wrap_select'] = + wasmExports['__wrap_select'])(a0, a1, a2, a3, a4)); + + var _wasm_add_cli_arg = (Module['_wasm_add_cli_arg'] = (a0) => + (_wasm_add_cli_arg = Module['_wasm_add_cli_arg'] = + wasmExports['wasm_add_cli_arg'])(a0)); + + var _run_cli = (Module['_run_cli'] = () => + (_run_cli = Module['_run_cli'] = wasmExports['run_cli'])()); + + var _wasm_set_sapi_name = (Module['_wasm_set_sapi_name'] = (a0) => + (_wasm_set_sapi_name = Module['_wasm_set_sapi_name'] = + wasmExports['wasm_set_sapi_name'])(a0)); + + var _wasm_set_phpini_path = (Module['_wasm_set_phpini_path'] = (a0) => + (_wasm_set_phpini_path = Module['_wasm_set_phpini_path'] = + wasmExports['wasm_set_phpini_path'])(a0)); + + var _wasm_add_SERVER_entry = (Module['_wasm_add_SERVER_entry'] = (a0, a1) => + (_wasm_add_SERVER_entry = Module['_wasm_add_SERVER_entry'] = + wasmExports['wasm_add_SERVER_entry'])(a0, a1)); + + var _wasm_add_ENV_entry = (Module['_wasm_add_ENV_entry'] = (a0, a1) => + (_wasm_add_ENV_entry = Module['_wasm_add_ENV_entry'] = + wasmExports['wasm_add_ENV_entry'])(a0, a1)); + + var _wasm_set_query_string = (Module['_wasm_set_query_string'] = (a0) => + (_wasm_set_query_string = Module['_wasm_set_query_string'] = + wasmExports['wasm_set_query_string'])(a0)); + + var _wasm_set_path_translated = (Module['_wasm_set_path_translated'] = ( + a0 + ) => + (_wasm_set_path_translated = Module['_wasm_set_path_translated'] = + wasmExports['wasm_set_path_translated'])(a0)); -var _wasm_set_path_translated = Module["_wasm_set_path_translated"] = a0 => (_wasm_set_path_translated = Module["_wasm_set_path_translated"] = wasmExports["wasm_set_path_translated"])(a0); + var _wasm_set_skip_shebang = (Module['_wasm_set_skip_shebang'] = (a0) => + (_wasm_set_skip_shebang = Module['_wasm_set_skip_shebang'] = + wasmExports['wasm_set_skip_shebang'])(a0)); -var _wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = a0 => (_wasm_set_skip_shebang = Module["_wasm_set_skip_shebang"] = wasmExports["wasm_set_skip_shebang"])(a0); + var _wasm_set_request_uri = (Module['_wasm_set_request_uri'] = (a0) => + (_wasm_set_request_uri = Module['_wasm_set_request_uri'] = + wasmExports['wasm_set_request_uri'])(a0)); -var _wasm_set_request_uri = Module["_wasm_set_request_uri"] = a0 => (_wasm_set_request_uri = Module["_wasm_set_request_uri"] = wasmExports["wasm_set_request_uri"])(a0); + var _wasm_set_request_method = (Module['_wasm_set_request_method'] = (a0) => + (_wasm_set_request_method = Module['_wasm_set_request_method'] = + wasmExports['wasm_set_request_method'])(a0)); -var _wasm_set_request_method = Module["_wasm_set_request_method"] = a0 => (_wasm_set_request_method = Module["_wasm_set_request_method"] = wasmExports["wasm_set_request_method"])(a0); + var _wasm_set_request_host = (Module['_wasm_set_request_host'] = (a0) => + (_wasm_set_request_host = Module['_wasm_set_request_host'] = + wasmExports['wasm_set_request_host'])(a0)); -var _wasm_set_request_host = Module["_wasm_set_request_host"] = a0 => (_wasm_set_request_host = Module["_wasm_set_request_host"] = wasmExports["wasm_set_request_host"])(a0); + var _wasm_set_content_type = (Module['_wasm_set_content_type'] = (a0) => + (_wasm_set_content_type = Module['_wasm_set_content_type'] = + wasmExports['wasm_set_content_type'])(a0)); -var _wasm_set_content_type = Module["_wasm_set_content_type"] = a0 => (_wasm_set_content_type = Module["_wasm_set_content_type"] = wasmExports["wasm_set_content_type"])(a0); + var _wasm_set_request_body = (Module['_wasm_set_request_body'] = (a0) => + (_wasm_set_request_body = Module['_wasm_set_request_body'] = + wasmExports['wasm_set_request_body'])(a0)); -var _wasm_set_request_body = Module["_wasm_set_request_body"] = a0 => (_wasm_set_request_body = Module["_wasm_set_request_body"] = wasmExports["wasm_set_request_body"])(a0); + var _wasm_set_content_length = (Module['_wasm_set_content_length'] = (a0) => + (_wasm_set_content_length = Module['_wasm_set_content_length'] = + wasmExports['wasm_set_content_length'])(a0)); -var _wasm_set_content_length = Module["_wasm_set_content_length"] = a0 => (_wasm_set_content_length = Module["_wasm_set_content_length"] = wasmExports["wasm_set_content_length"])(a0); + var _wasm_set_cookies = (Module['_wasm_set_cookies'] = (a0) => + (_wasm_set_cookies = Module['_wasm_set_cookies'] = + wasmExports['wasm_set_cookies'])(a0)); -var _wasm_set_cookies = Module["_wasm_set_cookies"] = a0 => (_wasm_set_cookies = Module["_wasm_set_cookies"] = wasmExports["wasm_set_cookies"])(a0); + var _wasm_set_request_port = (Module['_wasm_set_request_port'] = (a0) => + (_wasm_set_request_port = Module['_wasm_set_request_port'] = + wasmExports['wasm_set_request_port'])(a0)); -var _wasm_set_request_port = Module["_wasm_set_request_port"] = a0 => (_wasm_set_request_port = Module["_wasm_set_request_port"] = wasmExports["wasm_set_request_port"])(a0); + var _wasm_sapi_request_shutdown = (Module['_wasm_sapi_request_shutdown'] = + () => + (_wasm_sapi_request_shutdown = Module[ + '_wasm_sapi_request_shutdown' + ] = + wasmExports['wasm_sapi_request_shutdown'])()); -var _wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = () => (_wasm_sapi_request_shutdown = Module["_wasm_sapi_request_shutdown"] = wasmExports["wasm_sapi_request_shutdown"])(); - -var _wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = () => (_wasm_sapi_handle_request = Module["_wasm_sapi_handle_request"] = wasmExports["wasm_sapi_handle_request"])(); - -var _php_wasm_init = Module["_php_wasm_init"] = () => (_php_wasm_init = Module["_php_wasm_init"] = wasmExports["php_wasm_init"])(); - -var _wasm_free = Module["_wasm_free"] = a0 => (_wasm_free = Module["_wasm_free"] = wasmExports["wasm_free"])(a0); - -var ___funcs_on_exit = () => (___funcs_on_exit = wasmExports["__funcs_on_exit"])(); - -var _emscripten_builtin_memalign = (a0, a1) => (_emscripten_builtin_memalign = wasmExports["emscripten_builtin_memalign"])(a0, a1); - -var __emscripten_timeout = (a0, a1) => (__emscripten_timeout = wasmExports["_emscripten_timeout"])(a0, a1); - -var ___trap = () => (___trap = wasmExports["__trap"])(); - -var __emscripten_tempret_set = a0 => (__emscripten_tempret_set = wasmExports["_emscripten_tempret_set"])(a0); - -var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(a0); - -var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0); - -var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"])(); - -Module["addRunDependency"] = addRunDependency; - -Module["removeRunDependency"] = removeRunDependency; - -Module["wasmExports"] = wasmExports; - -Module["ccall"] = ccall; - -Module["FS_createPreloadedFile"] = FS_createPreloadedFile; - -Module["FS_unlink"] = FS_unlink; - -Module["FS_createPath"] = FS_createPath; - -Module["FS_createDevice"] = FS_createDevice; - -Module["FS_createDataFile"] = FS_createDataFile; - -Module["FS_createLazyFile"] = FS_createLazyFile; - -Module["PROXYFS"] = PROXYFS; - -var calledRun; - -dependenciesFulfilled = function runCaller() { - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; -}; - -function run() { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } -} - -if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } -} - -run(); -/** - * Emscripten resolves `localhost` to a random IP address. Let's - * make it always resolve to 127.0.0.1. - */ -DNS.address_map.addrs.localhost = '127.0.0.1'; - -/** - * Debugging Asyncify errors is tricky because the stack trace is lost when the - * error is thrown. This code saves the stack trace in a global variable - * so that it can be inspected later. - */ -PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; -if (PHPLoader.debug && typeof Asyncify !== "undefined") { - const originalHandleSleep = Asyncify.handleSleep; - Asyncify.handleSleep = function (startAsync) { - if (!ABORT) { - Module["lastAsyncifyStackSource"] = new Error(); - } - return originalHandleSleep(startAsync); - } -} - -/** - * Data dependencies call removeRunDependency() when they are loaded. - * The synchronous call stack then continues to run. If an error occurs - * in PHP initialization, e.g. Out Of Memory error, it will not be - * caught by any try/catch. This override propagates the failure to - * PHPLoader.onAbort() so that it can be handled. - */ -const originalRemoveRunDependency = PHPLoader['removeRunDependency']; -PHPLoader['removeRunDependency'] = function (...args) { - try { - originalRemoveRunDependency(...args); - } catch (e) { - PHPLoader['onAbort'](e); - } -} + var _wasm_sapi_handle_request = (Module['_wasm_sapi_handle_request'] = () => + (_wasm_sapi_handle_request = Module['_wasm_sapi_handle_request'] = + wasmExports['wasm_sapi_handle_request'])()); -/** - * Other exports live in the Dockerfile in: - * - * * EXPORTED_RUNTIME_METHODS - * * EXPORTED_FUNCTIONS - * - * These exports, however, live in here because: - * - * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually - * export them. This could be a bug in Emscripten or a consequence of - * that option being deprecated. - * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden - * on every `BasePHP.run()` call. This is a problem because we want to - * spy on these calls in some unit tests. - * - * Therefore, we export them here. - */ -PHPLoader['malloc'] = _malloc; -PHPLoader['free'] = typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; - -return PHPLoader; - -// Close the opening bracket from esm-prefix.js: + var _php_wasm_init = (Module['_php_wasm_init'] = () => + (_php_wasm_init = Module['_php_wasm_init'] = + wasmExports['php_wasm_init'])()); + + var _wasm_free = (Module['_wasm_free'] = (a0) => + (_wasm_free = Module['_wasm_free'] = wasmExports['wasm_free'])(a0)); + + var ___funcs_on_exit = () => + (___funcs_on_exit = wasmExports['__funcs_on_exit'])(); + + var _emscripten_builtin_memalign = (a0, a1) => + (_emscripten_builtin_memalign = + wasmExports['emscripten_builtin_memalign'])(a0, a1); + + var __emscripten_timeout = (a0, a1) => + (__emscripten_timeout = wasmExports['_emscripten_timeout'])(a0, a1); + + var ___trap = () => (___trap = wasmExports['__trap'])(); + + var __emscripten_tempret_set = (a0) => + (__emscripten_tempret_set = wasmExports['_emscripten_tempret_set'])(a0); + + var __emscripten_stack_restore = (a0) => + (__emscripten_stack_restore = wasmExports['_emscripten_stack_restore'])( + a0 + ); + + var __emscripten_stack_alloc = (a0) => + (__emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'])(a0); + + var _emscripten_stack_get_current = () => + (_emscripten_stack_get_current = + wasmExports['emscripten_stack_get_current'])(); + + Module['addRunDependency'] = addRunDependency; + + Module['removeRunDependency'] = removeRunDependency; + + Module['wasmExports'] = wasmExports; + + Module['ccall'] = ccall; + + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + Module['FS_unlink'] = FS_unlink; + + Module['FS_createPath'] = FS_createPath; + + Module['FS_createDevice'] = FS_createDevice; + + Module['FS_createDataFile'] = FS_createDataFile; + + Module['FS_createLazyFile'] = FS_createLazyFile; + + Module['PROXYFS'] = PROXYFS; + + var calledRun; + + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + if (ABORT) return; + initRuntime(); + if (Module['onRuntimeInitialized']) + Module['onRuntimeInitialized'](); + postRun(); + } + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function () { + setTimeout(function () { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') + Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } + } + + run(); + /** + * Emscripten resolves `localhost` to a random IP address. Let's + * make it always resolve to 127.0.0.1. + */ + DNS.address_map.addrs.localhost = '127.0.0.1'; + + /** + * Debugging Asyncify errors is tricky because the stack trace is lost when the + * error is thrown. This code saves the stack trace in a global variable + * so that it can be inspected later. + */ + PHPLoader.debug = 'debug' in PHPLoader ? PHPLoader.debug : true; + if (PHPLoader.debug && typeof Asyncify !== 'undefined') { + const originalHandleSleep = Asyncify.handleSleep; + Asyncify.handleSleep = function (startAsync) { + if (!ABORT) { + Module['lastAsyncifyStackSource'] = new Error(); + } + return originalHandleSleep(startAsync); + }; + } + + /** + * Data dependencies call removeRunDependency() when they are loaded. + * The synchronous call stack then continues to run. If an error occurs + * in PHP initialization, e.g. Out Of Memory error, it will not be + * caught by any try/catch. This override propagates the failure to + * PHPLoader.onAbort() so that it can be handled. + */ + const originalRemoveRunDependency = PHPLoader['removeRunDependency']; + PHPLoader['removeRunDependency'] = function (...args) { + try { + originalRemoveRunDependency(...args); + } catch (e) { + PHPLoader['onAbort'](e); + } + }; + + /** + * Other exports live in the Dockerfile in: + * + * * EXPORTED_RUNTIME_METHODS + * * EXPORTED_FUNCTIONS + * + * These exports, however, live in here because: + * + * * Listing them in EXPORTED_RUNTIME_METHODS doesn't actually + * export them. This could be a bug in Emscripten or a consequence of + * that option being deprecated. + * * Listing them in EXPORTED_FUNCTIONS works, but they are overridden + * on every `BasePHP.run()` call. This is a problem because we want to + * spy on these calls in some unit tests. + * + * Therefore, we export them here. + */ + PHPLoader['malloc'] = _malloc; + PHPLoader['free'] = + typeof _free === 'function' ? _free : PHPLoader['_wasm_free']; + + return PHPLoader; + + // Close the opening bracket from esm-prefix.js: } diff --git a/packages/php-wasm/universal/src/lib/php.ts b/packages/php-wasm/universal/src/lib/php.ts index 792252295a..c59da6f3e7 100644 --- a/packages/php-wasm/universal/src/lib/php.ts +++ b/packages/php-wasm/universal/src/lib/php.ts @@ -404,9 +404,13 @@ export class PHP implements Disposable { let heapBodyPointer; try { if (!this.#webSapiInitialized) { - this.#initWebRuntime(); + await this.#initWebRuntime(); this.#webSapiInitialized = true; + this.mkdir('/internal'); + this.mkdir('/internal/shared'); + this.mkdir('/internal/shared/preload'); } + console.log(this.listFiles('/')); if (request.scriptPath && !this.fileExists(request.scriptPath)) { throw new Error( `The script path "${request.scriptPath}" does not exist.` @@ -522,8 +526,8 @@ export class PHP implements Disposable { return $_SERVER; } - #initWebRuntime() { - this[__private__dont__use].ccall('php_wasm_init', null, [], []); + async #initWebRuntime() { + await this[__private__dont__use].ccall('php_wasm_init', null, [], []); } #getResponseHeaders(): { @@ -531,7 +535,16 @@ export class PHP implements Disposable { httpStatusCode: number; } { const headersFilePath = '/internal/headers.json'; + setTimeout(() => { + console.log('Waa'); + console.log(this.listFiles('/')); + console.log(this.listFiles('/internal')); + console.log(this.listFiles('/wordpress')); + console.log(this.listFiles('/opfs')); + }, 1000); + console.log('Woo'); if (!this.fileExists(headersFilePath)) { + return { headers: {}, httpStatusCode: 200 }; throw new Error( 'SAPI Error: Could not find response headers file.' ); diff --git a/packages/php-wasm/web/public/php/jspi/8_0_30/php_8_0.wasm b/packages/php-wasm/web/public/php/jspi/8_0_30/php_8_0.wasm index 287748344da9c7dc15c88cf7798d40663afa197a..6ded6822aff8c898447f29caca2e5434c02e03ae 100755 GIT binary patch delta 3002615 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 AFJ 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

!YD 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

1d4-ojvW(7E6AO&a7rfUsJ&81pvAwW$SD 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%0D4O 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ź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

B#4Fh@$fpn~b^0h> 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 delta 2917151 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 PpUEKIu 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 z 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

_ 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�)#3fb#cozcdZ%6!`1a- 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

W~~c`xx&0) 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

s(-9-XeDgk5@c1K#xco1@F}qD3QFsB> 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�INHn@()B!Zw}QY=w6V)#EJ)iyk$3HrzXos>y44 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 L7LSWIh#?y2V^vq(~X5t-2*!yXMsX;{zu|1 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 =5dcatIb*>^C}z41(ln4IJ*P8YLT#k8?9y*I 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%0AT2$K7hvqQSf(CiY7^QfP^%343BQ;3)0`!GZ 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%0D1OTWOP-9v2s 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⪙e=yj>y-bTH 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

T2Mo?8Wll88j>K}PE>g80E zsD(`v`KZE|@G8m)Bde)}xj^W|tnF-(K>K*p?&J^i2H+kG{y7FT^{dJK*$7YHeNt>0` z1)L{kf^i4fR&amXY|>s5P0P7J<)vJgNF8R0a3>Bg8u^kWQL|nWjkKXGALRo>W_Tz$ zMt2P8Q!8O00w?NlD)A#S>n#S7<7Lrs-~}0xdjJz<2lzlJyck*0wQQ#Xvc3sU%Bkdf zF6sU!bFxWRN~upY|LJ4XzyA(OGliSH``T8GI$`&*kOv;1py&z?F2Lcy%cAw)!NC(5 z#Y!{|0Xmxi5D#5Edux;h6-qG8Lwgi2HesPGmBR3we5qQsnO3>L(L zJdp*uBSanG5RA>H$+O|hp-{11)gY#%4OU{riVRINx_yqw>|90L#iC`^1I)mH|B~IC&YEMVS|V>syq!aJB8Ay zJBT-&hg+MCrFW!vh2Zn*S43+_=pJ~*ui5QfwdQ#apoW#VkB_W_dqs5Ao({#{3zos% zI8O|BuCXW6{wbZ4>Faq=kzUcvF3Pxom!Da$`8Yrh(DeEKnKi4{%s3Z1CK3LsXc@%S zc6wDj3<=`eSA~ZcW*@#*;~3=Q1BRp=2B{IwEf4O?Mei`FfGT?s^?6OC$F79z($Aer zuC3@bk;+`#>#vErNfw_36CI=*k_`1IoOiHm#McmLeqk|LV}WQA#33I)%{u5&)O~?y z*tA+8P)FSx3q)RWpx>YOaA4C>YR5Ss+&jBKH0oRRc3F*IVUl3ImC>HO4e;i`aov_( z1u-MYF#c6x>WUJ|sjvB$xG6C8bZWX#)G9ZBCMUfY;!3b-E9H z^x6`UoxmRMp!DGAM_=ik6vuntUR6glx!Djs9)~6;Naa{>?CNbra|BU>B_^NCQP62q zkF~eOC76+4qP(oxFztze;TK;QyTi=7RIsh;07!fTmyos8^$n5cF#DjV-Vit0m(q?m zM2E0BpQ_lNiEoOm>?+R;R7onW3f_dmJuu48-W2N)Rc>3tuq1l*Ezwf8&bYqst!lR3 z^lfoHhF$QsxHq6W0NG;ZqlC`BE!s(FSo^3twm=f*IF}^M^?!Csr3FhN%3?scFx1ke zqG7cF(c&HPc&cfrCWB)#>F_$VU5NWEHEVSLjUmbO{X1ecU^D++@pycN(oSs`_Q4nzusa`0rK)`o;<1B>AKpMf+Fasydv`tq^U~ ztZr;NU%o<2ZrDE`PC?L!(@OM4{9!ePN&pki3l6;~wmGK?PN5H0ik)#Xau16!Ib%uw z5YV1q$h)CmE&6kF=a`*T3_2tP4C4Z8O%ThfYC30FKufwaGd}%k2Pf=PgyN8(>N-ujYDT@r(>Y& z#tQJ211Bx`4bZQW)uLqs7SvYmtiXAuJbX)Wu!gcf<*pGqx2sKX8F^hb#6t`q;2h-k z+HMC_e~4zml~h{r#@a$n0Tvf>JOG}YWYElOLA7MYOBH;|fiaspZ4i^H%0ryrAnHpY^GjEH zpby!RSG{8EqeR!gjY&Rcn2~a!&dbSkrJ}i zp7Ij1=tnv3ueJJ8qhdJ$TS$KyYg~El1M3h+x!Xik|1}oha+SvIQo!BgTr6J=J9OxjZM;b8X&OuBB7}H?8!+nLr zS>5p|^k{Fbc>Ghb*>0al9X}J>9ous$ek;T@Mbv()Xgmms=TQfiFPzAigBAAT7M=Qc z@AGDp30YBMlYHU;e|Y%dGd4!VCrL7_Cq&ajT!AR97bax>0)3JWg%`2qXzBA^nnJM7 z9N?fTb89$b-U|!5)3Hq7y6#BL8`908mqvp%2>jL6PpKjJSk|7UKema~pxeyemtaDM zBedavgovCJjpe}7fM`GVA5mnEt>+bwjW1h)v9ah&cWPhd%3;yS?c$NR0OjPpTojHk(p|lF>=Uw zdytJ%KyUW%FZ_lwRh>rn8yY83)K1Z^UU|JKc6E}{o0hj(ZcsH4VNcNh`8U*}J9mnP za{Er%DSEqa2ei$Ds9MV1qA#m`X+2u~D!yH^mwR@JN81I6v&G9-!^(bxdS%v7>3A6`s;5V1ib4bc8uRI`le4mx7e6T;#BN;o` z1@xlhyG5d(6NkIyE~YqA%aQQ4`0h%CLiN58P3s4U!NISi!F5TY5U>F=LHhxo>#1+V zE0nWGBpFpkH4CSJb<9{_W{-r?+C8Fi3dc)Ahp_wB;lCU2zVixkGVfdXUt7Y+s&2U% z--^tzFW+z?j?6MD{#GQl4-i1uA*mZh@D=NC4rxmG4rW}{<5yn!PGkiv4Yq$Lx++Tp zFq651sqUX8X~ZEzp$_{+-%RSupK#SliYpE4YjIB zyX-)8kBIt> zaYh9nqAWdfVL2*0tk@{z&m*Fd`*x1u$k7m-Zu)0_ZnjExEyEdL4{ETkXH&SZ9bP+M zM=*CBx8UqJ1Q%ZmOeqMzvBNg?+I{Q(b>{God*1urb`uw35dk8B@Qnf&Zd{{b*T%uS z`0j1l(rWX)>b@I!x3& z$7$X%7}WV0j4P58fU|Y{0Bg^4)c*(Z5dQ4^0m9>R6n-2LX3tSe_2=&6Fr7I^Q`DbT z>d*JbaTz*CHBQJstxt%?cp7v9^7?Z~BO&V5K8Lh14rUJ^Jb0>t*HcxAM$Adk1ACK| z&sDAR@=4L!@rR4@4&9OpcQcPo#&gzqU6}v)gQor{(wK1yrK}%;VygA3tG4}3%0PS_RvB1zDpZFXJh`-j3pxl^frrST;TvmN@^bf&Gi3&WJk-s@(Oeasny2 zZF!SbU!W>|Qkd>#*yzL=Sp96JuwTTx_1WYTp@l7~6qx@0E4LR(`Bf}151XnY^o3s$ zEJdA9RTjE&pj*Eb=A=$(plIsSC8@h9aY?S zU*QlRJ}1&G-W{AfkQu!Dl{WUxxoXe%+TTUP0M`ur-28g36t>lcuk&9r&R_ptZN~Y* z^P+h*$;5&4BCFtHF~as}%cQLXHWbpdVPoJn8Q2H=j&tb7Q7qSzf$pR9HJ>^3(DHRy zo)@Sz+pL815Us-2rA(85Y;l-Pwg7QqVG7Q9DT0xaQiIwtO?BkGwX6)|cDfeD!xitlbJuF}hiK-W7?Huc4>;2Irs03U+#}$)bbqYj zp>2PNhogfEae%HrU=4NuC72wSx#fE4%}Zi=HTTe*KSkE%%;{c?F>W={=DMm~8zg_J zq{xgfa(Veb>`{aQ);_KvP9`JF$OVJ=NSM(NUf5rT868Cenfg}E4z1ZqfOz)4J~%t zIgBwR!Jr5V^_U+;e~Pd4_-jFsAv=>QMG;|SgS7;s!>nbfo3tAt3cK;Bh@jaKMr0s5 z#Odt&n#7TB2We*xGE}N;F#C>?#x?fa>8VH~JxGe8 zxIw6iN6|ZxMvm%%BTgJfBQ@kuoN_3DU@!8zjYf?m>&q{l7HBdcuZcpUVUw%PaCCx7 zm-*k>^qAYoD>$@4hL6f}+{`*Hm?W`)$A;{xY?x;7IgyO$Q-{%_7FTcLL9RoU6-3${oTWIY@c@!|jCC3< z0sXa3Bac%#IE@DQQ`=>TIKYloG-ZY}(q)XO$?Y*Uv)aSV&bW+6?C;ay5Mxl(awz^V zV-8(4iS~vVS&1_F2M1n*-jvCN^|4N4>tY#9f!`{#>kKT<+W5HI1IRW;howasdI0zTFau zooKpbNX1FHG1JkSnCmRcj57u#t1vIT;CvOu^6`z}WD>%^(407Dw`p{YNL2b~-=Bi=}8Xm#)(#BQ_pGpipV#6^PaAsi=$b?M04K>6`TYbP3|C*qB) zys8~Y3dYKm@XL7PsqD~q~p}8-aYbYx=~%Tj@vzwHLi|_;?EwVo#U4z%JUk@?fud^%T|NWm#UF8#-DDh zV5v3NYjg@S4!2ad&H3(AD@YMu{Vr&3hS9KW)A#<@4JOdUOryHCFqblo%xbP?-?~Qc za?T|i>l#^-!#-ITOw4RbtOrKh^sg~JNiKeGd6I-y=3nzvJ>v$5ptsgDx?II3jdtx) zoOCT1UFhfnPLbJuDFtUkvkd-9ZLYG|a(tu_R~hx({TZb-PCC+`=3Qk>39_u!1FhAtK%ZltW-^_{WTt_up{+ zlLfL4C1)9pTd;MS#VJU68z29SXoL0F#%t*POWYQegSQRmI$#2uGkP-1Xwn$W7)0dg zS$@{v{4yFchT&{DXqQ(-7L!8+hg>Go1tNCP;5hm*%LsG88UJjS(HRs^zWYZ5pvD1u zw1LsH9uLQFO(_*JrgOPsO3dz0H^4dFi!Md=7gSP=Mh7=!wxkY4g0O;%G^mHR5yX&VOH*QKY zkd9Mkx7NS@p5p@K57EChVpizgn`LHPrt2@}yS{n`J7BLpBuQ}Sgrn_eLTA#k!d$4I{V zG#(v5L9pNmV%@|XRg=NNqvDT<8R5}qBiIL68~#W&8yiOWo9B?@i-$Czv60lV%y9KX zzo~C3HUcKctHE)O!0UgN4mhbqTjsUMsh8qP(Vtc~Htx7_@wPhXCkQUA@xhvURJvpR z_1Dv6xBjLX?WMUkqA_}+kQ+r;O#qiM)WNw%zZg1>yssu>jLGlHH9YN3A$kE=F3zZ^ zvGrMm?tk+T>jL^_gz4Y@9tr-~k*}Xnh56o(v?iC9P_rh+&WLHtIQ$aF$%!23Qz>y-qh%y zycAY_XhGU`a&znyrP`t=lR72R@uo(k3#<7SEsY(XOh*Rw(&U`2J%u^vH8WB@M}J2= zf$5Dw?%s|7*!UE<3i!|*DsEGwKAez6Jp)F=};>ps~>L%i5g5daZ1!+ z?xnEUrjPy*Vi+VXQV>&VB(qpe1_B^~s9qsGAivTogX_g2y6_7?gy$HAM3E1-L?OHTf{oN@=<92YP6ZN87NdPNdH$vPpJmXz~mnq$c>MQWsc0J~^)qHd@7lD}Y{8#`At9l)HUD8x%%v<8cws(cCZx=eY%-^!EVFRAFe~v9F91@^3?or zyj&#!BwU+h_qu50rH+~4Y`(}hx`h1vT@8H}d37W6nn_E|pw7?Ov5M^2z|4$Yzi=wT zf~j@-Z3OnD$;bNWF;vykKA$aM=YmL}+ z|6HY~32@p{V6d-+*Fkx=`7-mR%-N}938irsfGKt7Ce30h^^>21@!$eaOwWEwqW#wz zxsl7xa_n4*9LXJx?7C7t#vWU8Zp^m>#8MKAS)Mu;0Tek)_jNStAmYThj>ZhkD9s10 z3*uY&j08*uF$ikYQ$C|60=-Q08S#0+m7Oe7WBlhK+;1rs16-KD`flHH_M{u`|R!NFv@D+aJ!{mpU7b8*mm97EobRXayO2@kyLy#n>S9gd>UZSbpjWiFk9O0ANj}E;Mnlj#xSVHAd zxP$)F-MFgeeL5t+SXl=I<$NsvQiK@tMt1TqiqPX5ZgmkrC#*c=@Y+~AUDv}%De!;C z6xW7lgbMh*jh`aPs#=3W^`QF|f%)1&JFlo+mXr7O48~0E8VG+C_x_C8g7nkl2W_7} zl?&(GvT5(bzZvf%_>cuHKD2>O_Q1UX*Pxq>o1&OfaFoAzp2zT;jQZ|@Y_-mzW8ELn zyqhF;X^CAE=+ey)0Su+Q=Z5CsPxqci>)J>Q4MO5YFJ3!ayW@ukmtvsU{GLXwFjF~5 zYkOkX9gm~pf5;6fTRVBR=;XEpnfd7wTd)aRq;?$G4}w^1J%F_8ORWcHpjTQCQ6R5&*FEt)3lS*;#en_V zJUfo7Wv3x=<7bz8J~i2V4p+~MjyiS8GDhLqPkkS;`47hIN8OhPbkaq##oVli@gL>QnsVPeBKN6!ezZaCshuQh5E4?ip z#o!j$->s3(F`H0VCeLC=Zr~&4bCl(2HhrO9oC_e$(JC!VlY09)1dnnqJ*X)JdgkC~ z{83Z0c4;sk(!{XS2D$!enlumXS> zjTS4z)^ZKbRt<8yS;z!f5&VG`i_l^vD>?Q1vO|2M%0ql(LRi_{U|i z%z*ogN&kixE17gjxd!K{C943%0^P*9z@%Tpq|4=IlbgO=iwiE(V#Nm6V~FKa-*JOe z4+DxFgI0R6YLOeRY|{E0_+Vna*QrnY)nQJY?z+eD@_}{0-w{o_$4JiKDFYz;(Jzqk z(7(@09N>EO*`I-csO{vn>)$W4)`*VZV>D@wh8Jyx2Cw|Sfb4FYOfrcBhRI-*wDZHn zK*p%sK!-D~8wLa#4@OeB?^1NREzHIGke+2v8yWq?FP4>B@&$SaVT zEV^Rl!q0igOU?SJddZQpL;mL=BPnJlUIsy7{vacb$@A8QP&`y@vZP#-E00=DT9+Ip z2AF52ZbZTli%2uu!$+AUoNQ6btb%-CJ`pI#w20fwq8fJ?wbFi*@WQ9F_;J*(ufZoZ z&{9rRI`Tf_&VqTIPAOcU)))uG`^>Fm4bA}2bj7l)D?)a&vU9+FQZN0I!2%K{@uHEw z6^$^cIpv?U;Ip$>9p-N``6TXom*SXXKq59Si4p75KaIy8bZ7;ESL=6iwl+?-XcfA! zE)IplgWgO$8mHHi84s;8yB8w^qK@Q?{#tW>jK{v|5cKBPkGSPx3)VSRjXaP$+*lTy> zON&RlRur!$g|KEA{NM~Jo{8@wbF8pUq(i$Mq7;rjw2;OPlQPT=!;BmU?)^UvlOn&+ z;Si-ArpCjK;RpvdXSk6DTc9;~S%5Z~Ev<_%jhL}K*e!A3($WY(ax^5fn8xZ)Ifw;6 zfSt!BD@$)OM4viU$z<`IuR9+ath)wlYg~}b|7D5I@UH0(OMPAy8gRdnRI9RfN@&vk zM$0~xefq=cZeY`)l=;hU)&WEKKncE}F*Fm}Xa-5E><|A6#N zn-GQp%=?lad%(ESzJWGBV5BARu+fUseJ55&5>Hgfpm$aeNQUrRYd9>WwjJ3XY)sgg zwBjrG30=#PCDipnX}WX&gD{ynv&ISdyedsz0W07Gcb&nu_&`?%p#1@81@=B@G(s2= z_d`ZrwpE2O9q6Q~YJ6$VaG)Bilei~Y@7{-umZ??+9hmFL#~Sgf$bPhi^ua^M0{frT z?_uLMbnwB$Myq72d{77KPQH*LA2Bki-o7re^k=^=$t^y|;<0FgwVgZ^ZZwMj3)e~@ z4dp!&kRLmM8FpM%Y0@J`dgO~ZM3i)a^1Z%{jBvD}+q`zYOz+k}u?!38{3Aw7&sz(_ zA?cF>3u;>kTCaOa!ebi_eW_Cicqac}F zNLP(A>PPrnrfs7|11cD0G=wPR^-&OEN+DoJ)P8Z{FD))K zykW8~9!d(0`1HT4;T&yvuQ6-Lwt?~J5FpF3-CBhn`~5|ISSbAMh(ADm|A_aGHuC)= z4!z7A^Pdi?G3aSysJ}+YWon!Wu8}gvXy&hRIXDg*VADCcd`)gcoCD%+alImB6-*#(z zNhJrkPwbcr6F^0`vu0^CC%?^}Xe4LJgO=|#Y`xtlJ5f-2$IPEWE3{0ya+P{(GcBU1na`t zcBo?bX>yT~SPKV=?$p65Ga-X%9jrm1fLK*zv<1C8TV#yyWBHOzlZq)Y5osgGY1pn-2%dXnD$IEzO)~scP1OP%NYlM zHCdiZ=O-IqV}2WIIF`)c3S$#s!oPJdL5^=i%?< ze}$tfg&uyvxW7!B>HrKg4?xPD4o-0<-8$X49t_{Y=|)T77mduAnf|nFPJQki8t|g=6w*8Id(rTw`}K7`0E*qMaBtyLL_PGU^chBaO@E=z zIN4U(QHZ+Fz<~=h#2H3T=-Qu>Ik(uqXBfE!rAHVAA*|lwkg8k{Zi&qm3UZbz^%>_b zK65Y9xQkH}mlM|G!B_GeTr05bDBsyzn_%GZU&ve5NtcXS!jsv=;Va ze&0*Jhw^O_>HG0Em8>#ioy$of(BvPOZ03z^bxl*gDGXhWH3N9eeE>FEII zKw3Q?RBa&bosX5;wI@)z2NWZ3K4v|XXvOcuM2Ss%-({p|YFqd@~kz*-6l z9c=LNETUTUVNy%S-T1L(9WZNv{D>{DO}68mta&qjd{qeC?JhquX$XAu;bXxm{+chp z;*Jpb*c>0nkH)tq@*BvR{PyWG^yE>^>!T0W)^{G1H(gMzy0Re9S{D56eH6s;&*RXi z{Z?Dw?JpQF3j*g+5E=zJP!<4AdRiXwm?FMtgbl5Kdwvmf@4R%!_SAv&Y=R`+I_LJo zy%N^nWeZ(Ip}2~L^j$wD=^MaV*pp?|C6s73U4RR83NQx9o+3a0`&g3Rx{`wB%l+|N zlK!D=F)#vHODw?v+_JhkbiDf+?;`je->QzmNEfTjcjT20ta*Wc0)XK}syI0mh%ni` z{EmZ!>(lWI7c+e}zmZn7hYqMWC-7IjS!uoj_0)@HO>V8&|9vXn0g4%H+gqw4SGx+F z;E)b3DNr9Url_GAPBuYhLr9P(r}ktr7vS$+zT9~Ds|#NX%6$d91ltdM42R`C&Sw_6 zn!T_P&T52T-RnH*){*RDvz&Nd19#(SRCB7Sx8nMUl3HgsABEc_PT)Y!L`jovNr#= zx}I9G^6r;wl&fqOl9l{T-{P(~>m8onN zl9l5UkgUwVt;%m$l?wu!YwtJF z{W0ax%q%1;^KYy2@-mg>{?k|fR=&1bO4jDzR_&E#YBON;DX_JOE(370kgUwVt;%aE zRxX&k88%2|YMZ5GZT@Z5{;*>0k5Sq5@iXa>Sx8pq-&W<~ij{Y4Mqv7aGF_XcWbMGY z@&BlM_c$A?{SSO!=DugxV`i8evuE7KeO!}Up3+_q>3$(c(dASwIbFV;d3vQLs627(2*nxDJtYv2>HF=pY`m$pFK0u@4w&g)j4KA&$F(d^;w_$`YgVc zcC5+fRFAd11x;UkvW^-iAXIp*AzS#g25*Jcn7_31J`T-3kS4<{g~S?Yjh`(%fnTVG z;oJxKgWfS08rny&TjCSQzbE)`rsRD_?H6?Fyzmo#^roMk7jBpI;V;R!DnnngFx)sL z%^J5SmruPHh8rcO1^X5I^<@jg4Qev@joJkC7BqH551b!%#DP znQOp_t%FW9XbOJmZi`^WSPFh25YuPohZ{iA@kZd339gum5PKON*1Fkk)uYjA2u;?j}ByRXH?Ex|<*0-JJODs`N%m?(UB9f@mkcFTEzE za)_4n^;Ude^G#o~oT>dJ!X)R*{XY7!T!{W7R={m)Mc#e*P8M#c11`DVt$iy;vfal@ zJ-RTPfOVDGu^=05`CM=2F5?@&>&;1=QAx8#>~Oyu^A1b7NAO{bd~#a(B0V zdp2C}L098*mgQnd?g4zWu?})ByF2@Od@kO=0S)l3khlqoMusB9BqKyV2_3`k=VwvD zOQ450FzfOj4oX4Ph)Ow8nJOw4p(4LluK2#G7?p6M6{8XnD&p(;Rcfv>HBVI;?7T5J zxlO`{n)s^gE)D1Q8xf^)kvT=BCKTh>$|GBC+8bOhm>Xm48r-Un{r&v1val%0w$hMITh;*UA+? zF%_d?3@c{K-iXRQsEN;d4o225DzHR5hzd9;#;=t-SZ6wzflu)uiwZZWh_AZd+h~7Q zm10pT2F3Wba{KE|`%#G`IY`-;c1-NpuoFFzl!){R-#4F0A((9z zXugfl+}zIdZa$AjFV6EmK6CRp&qw)8batLk@tN4?JdXx_x5|kw&Wmw;!R2)ZP{C)e zn)5t~&s+=Vc`}~~V&{1(p9xpzc?O>e2IqMep9wMN8JefnY!(E8;IUMZfvlyz!H}W? zQyaiA35!l>NQn<7E(kQ%ZbVM&0n5WJiX=D*F*P{*%XMMg=qDdY96UK~g&z5CIQPPG zn7o3|`2vnB+46SsAV}N_bnwtxGVaT?4jyRUKE~#_+S&7CEsHkgXgf)!9o-sj`o8*1 zA9^QTJAMD0T41#2Dz)bcM2VcU)O(}y{oU5wSKrlc3AihMNXf zrpMQdfJd7DdS$w4e%p&_XD{X(_od#s3S-^-B`zYWZpCCqky0nWPvF^(s<<0hYUjsi znRn)D%=^oaoq4YwTci4caU=LoFLuWN^xm_;I=#Fz!XE-_Qv{}47yl8kqQy3>Itzx$*jBA_R_M#K?PI};Pk%H}+x=Fh z#zJR7^STDjr>r&grkoAUWnovp=M3Vr_x@-~(PA&Wb{23CScmn0cKILel_!^*z4Fo) zSE;(6g1<&*Lc=LoiELPpB^%abJ+p^zedceTisofjgKkSjaSx;e# z(Q<*dG12n~>8I<5HVAfkLf?J>s;|;WT#3SuqA8wHHFw(=( zDzAeZ!VR(?P6`D6ljJcWv>rsKufZ34L%30S1rEB4iCb*@!RK39d*OpOhJGey*h0u} zLCm}L-%-#_gTpM3q9U*<`u>YwYtc~Tyr*>rTHn$ZP!4fqbgFrTCznsVF@M)b46laV z+Gf7O#G_Ac2$z=6!&R)992`q>YR?<&2Ln3)15PC%3L$u;2IN6ngv8=b&y+Mxt5D3{ zfYvLyBq~{stW}t4@XMgJk25CDTD$SZn_EfDvSp7(wcKVu={3Ahs4oh2WUG` zk^;{nT(X<=^v@BWD!p)aH|sT@hwGP&O2k*>azp#138WXM+ZDb@KN*|D#hF$5(HCqE zx2Z80C&S?x3vTkFvrW2ub2vY6^80i&u>#QtH|trbo8)}_WOKNv)sz=7O9lpTpuX2$uv7&tQl1 zWi(U12p8s5Uv_P*>_KMVI!?%ov_vZNSZGP$6-q@~VU)Dk;+aE&Aat1=KBI~jF%W(ZB zX2f)wM@P(&uknHY6O`>rKpTVoa9eH3)^JJsFn0r2Yz-F|-YiL}L!MUfdm={dp3WFP zs-R}DpMGL%_?d>t)`h$d8G}nQxDQ$}8%9zneQ-%2k_o0HDHPB%w;^>w-;zKmb#N$y z$=TCGi9>L%WyDwE;`BbDG{jCYZ$)sDe*LR(YhohPs+RB$Y=k;|s1JOFfQ50ocpJhG z2J3%p1JG~K)3$}1=JYMeV57JSbg--4ZQH7ArS5hFZ;aEIZV&fCD=%#iH%z<%!%LUp z<@PN}ui8>RzJ9YU+_LJB&{(s?(LjcA`u?xO^>U^oRix}D?$zir%>6oCRA!ce;R(@Y zU}#mO5Zn#LJTMY{p-+E}%{2NbvZn(hP)nD56E3N{=Ll1AVPEsgJ?wq2+3j-~r*}x- z^i8;74)z<^pFtU)^*iVa?kUn!z6lqW#vy+K(L_pKA&q>3t>Ty1szdslZ^E@}k(O~f zygnU7hD0ZM2b>I(^u;^E#Wj)P3~Uvt_dJ8aglFpec7&VO`sEEI=;j7LB%y!(u{{>- zz$Q3^seyQb#0e>pfN8;c6xh8Z+_L%q9>v@d{KATnf(!=i8+;b$XOM#)z>*Q;qwcmd zd^4El%$-Ohv{b*dGn|(r`8W{(2rNZVBXKkVVe|X&Nnur>asyOou0H@r3}=9AcbPWB z(EN-ZkB*qj5E-W_(ovw>dsnzgn&frEE&$yw-xY4$WD~=+(G&te9il|;QJE-tKpofb z3b$=K3bLk9E&?C0eE<=o7!L@q^vV}?zJSFED4itK|B$};dj!Z%(u2PbcgpAo4oUCZVr;A#dcpU|JU}!^ z62cBV0O488EUrI(A1>+o<3ntOdk~`lEK@;`kbaScmU@d*AYT^aQudGFD8u;%EXYAW zZUB&>u!){~!d9}`cf<6AJ>kB|-#(5s27u1NJ>hWjnupdcWV$q8sxj@{23a2h0Jf&o^+HXQ8}dV{~_G499~4LhGll9Ob>`VGnAcOLbYkP8&2@Um#M zJc%i$ArJ9V0e~Ax7>a%beRx#g@ME~4I3*wc5yX0v{_022G6P{UqK}{XDO@|VU*&P? z#y^D{XPIJVKStK!rk}#0!gpjHghJ49+sBLzXoWHAX+MQa2TaW--IZxA1_A;7fdi&J zLy?^J3@AWY*bLHz`nuzO14J8afT9IxunoeBH{xZN;7z+?`KBA}3pZ2(V%Zz95FYMb zFuvd;xJ4B^YAxCUiSZ1PbMzAW!=V6PfGNuIjjq@i?$FjOHRLe|+!zlo&LA$y2%`AJ z4xB0L6Z;TD-CuXuAD-`BulMXn(Bv9@#R2TwuXXdE!}SuTCfT1H92=L2^*;s zkn#8dBrr0i5CM3}&*7pvm5N{+Z8Dbu zb@k^c<2#+IPaY0mkoC#xI3~hE`qCreqGZGOHtBnhKsa2cpTj!@ZNGg42j2$kJx9WI z3%NQiz(SGCS-40$w2$g!mz#9xXt=f?=Oy)&BjI{=H^6G*949OVs7exqq~jO}2E9!G z-%+R$EP@kbdIkG4J#_e^9^`HpK)O&GS>FLgqzh^ia1{2kTW(t>=(dix_;`H zaQl#%y3inUZUVK`M*t9KIfuQ!K;r7BbAJuj%^#f<$;cli@GI6b3;!W~IlecFAcK#{ zunY|#HkXu`f9K<`gA5aY4L2(|0c60LcSDy^G=dCZe0s~T1{px?=zAa?pdjQk$T0nz zaBh>TvXB(6h;a^|VF$YJF~NohkA*wd`QTN=Q9AMs#fV?*$;on<_tn}j%-g)K+%NLU^6=NI1bN!dOREqF8r1?1v`20 zY?D5K>TOJQ2llSv2%p09GH)yIQSc~o-fSzAewY3yATw>!|2%Pa}av+Jdl!Tw+13i+>Bx!-{YGE!_SR)2pG-(g`_!BFHeY#HmR}33R~AUC0Je zoJ3@BWGdWOBg%VVKqczor^5YnPA3_u8oM)y zD`k8^zR)`}ZZFXF)|B#KLGX0=+6G9n%mE^`B+9un2q&BEmIU*V9&;Kh!&7?4>2SLg zs%8+bZqS9lhu;L>{@?H6fentEbbG1RWJKOT$dkX=0;iIsbsPW;ex&=H3D*ruygrT( zLd5~V8+h~^XTnAKkm{L3Ed;t6k$$GF!`fkU95@s1>>^)adOq$nDS3sU_kTpu6;yco zO4YdR{rP!d>B9E77O~>IZ8W+me)~2TrAQ&4o~_z?M?Jkw71tt5NN^-#AkI*rWKFNi zx#>*~#vll%p9F*|#-=0L;#6RK^oXv8_Mi|<68Ux@a3lCzZZT;zBncw~4lDu1bL3c> zAu$1Jpu_aTUKP3#^8%^42DCXbcsdBlpLZe!VQge(OMJxbQKi0UyKEAb(E;C<_}QG_ zT1$$U;1}CQ+{XZpaSfB#1`Nz7-BI?$5IH5>(;{P#>sp*K z=qG%t2Wb0eYvkN0!G~QE%{+Zs}JSXE+2J?fHUh^a#Hy0xzH8S9yrK zf7`Dv_npYqfdo~I14N;8Rj&rLk9J zCs)zWmS(;T?kGD+QX2{my(i&+b?RM=3izKG$t z`NgRrw8~^7g=`jU`p5xhZWyk&C8<_vaz_I<#T~l1y{fGT)>UbJV`VEZ4lH22;mOt7 zBO^es%<@70kN@VZoIqdnY_433SnJc@l$9kO!i64R*I7BeFUl}%HyA*Y0p|hkkG{lDT{#ZdGJu^jh>lAza^ULmKutltn zqL0s2f0RKVotLT_7jAN_sBt~KVbE0fPgUKnjP>yRGWJ0HkYNjBieeoSOh)&~6TmtG z8m8CS%fss&tkq>ns)^1{QjW;KH^8jgWfr-XO^=)Gh;nC7@#jt zS55L`uYYXhj9Q3DaJ`w~5PM~{Xb?A)=b_Iq{_s$VvIf^6MQx46Us%sHvFeLg>b}3sl;?xL9EWPD z?8};?OR(DrRJ>dtLue~QMLZlr1R(UH5TOF-#1nxlf~ui!cS!#us4jr)cbBEIOBkbz zazI3*IEt|eRF|`*BokPxSCpvwz`)E*)d`2sit4L|)$Ec{nW|Ox&ktt>w}I$Pm4wR25WH;ZUaPDMZ-oBEkfw9RpSjvy8RcKnrpx8gIvQUa_Lf_tlgU3!*uA zIH#6sogJItnms(+B@7ABjnP&CYwv22trA#!R}0o_veX0cAHPC43M$EQpb^!*fSb?{ zK>-C}2<7I--bETI2shJpX12<15gV;*IeMGrfGmjhxcc0n{dcx%jBR=rz<-vlN}R7Q zymUa#W2%%ze3d!cr2WibKU`Zms@S!fzpoTBtnbZH9g?S+TM_i33ss&Tf4xd{6^u~R zZ*tTV4P(pZka18Tuzbw!vP!edjunlKP>-B&X^wuRHfA|Uw;Fz99sNOVRi}m!Km*$- z0X$t>y^YLBOY5i!?MyOlv49tX?c)BFo5+dXEZ3`K40K%X z2B8n;s`j;^)62HuIcolb*9K?Bbmu(PDQz;6TRT`?o~P=%pfKsvngYew@jChA?{g6z zJXmkcQ}s)!NYmGYwjSWQP>^_vIFqAX@aVie2%W=qVZI9GB5kHvol$x?%?o0%MPYqS zzG~WZ21F=>==^e*L%i4^G-u52_tjATMa0sx^Htq)sJWu2NbmngZ` z5}wuEoF)b%z4PfF=fppG{Hok^X z!P-D6A@2&hs{FDDT8a^gL0WW;da8ct_aLPJrr8d;7U1wW9;X))cV#_QCp(5dW07h? z>=MKE1NGG1nXv&aJi&WEhwI<#sbb%^AzfUgiVI_OXagKTQ13yaL{5WaK;KxTN^)W) zwmm{a%np{&PZz27Y-DYbDk_K-F^vdfV1u%aq!9Q;tbl0)()e)QGX&-;%2Kv&)fS5X z_>fAxFh&PlOXCx3NP;2vB)?Exs9Sj9P;v1FBY^15A=L${eO9q*)QYSh>xaZy06YYq zs_FzTbCVL-J-D!M=Ad4=dPK2m5MldN7p|^$P@tbM(fHyA#+P%L*c;G#=v2bCt2$251SulpWD$U&s?_9c_cu#ai?gzF2eA6u`l?O# z_6RHQUx^~Ss9B^!dK1;iyGl=}uNo!d06dJ8Pj^f?lyG0w<4RQ- zJ}fVVFxsX`L>SH11DdF`*43>Bfy?zMp*swMCqRuTDP!^3 zXB51V8E0e{W8|C~Vv0=rdVNdSm=-Le06;8~&k+HD)B|hou~r_1By4z)k9z|2xTuvX z=m7^BnVQ)SPA3it0$iiOb6a^tOf_0OM}n6A-AZ*782I=)1_QU2xaN5Do32ZF)FZ%A*s%_eCV!oOB+}5hNTlHj#vyN~q zP?Mv~uuv`6%4nk;H!v^+D=+v!HV|ufAG;kZffJ;zAviKg{ol|z1ph$ zFeFZ1bOHeei#n8O>5IylcyouynTTD-XefHh)da2yY~0L)w8QmlZB@gY3^6BcP#l!; z=BLi)YC0I5E7K{-NnozP$9ifz#h91!=X=)C8``P#Y$MU4GQ~BhM3a2DGU28Lh*B!H$-OJoU!*r`o;Qqt3-AQ$G^*-YvRuTF4xlSrSVHjwZ zp5962py;Qa)Ok6v)}J`Z^#zDAiu}${iO1=#oz?lS#`Kd_2% zY6lx6n{^SXIfCX>eHivZ^pw{Z9Nby~7)`@j6^Q#uJGo~ z=%R89D@P6btl6-lG1@R6a%ndeD#r~Th!%8+*enzI3DiSClxuimBInK&F@6>^_<#r? z#v_GF4u-Lfu21|uh_}>RWK^@DbX`%Um8do#%@B?&eERqHikGc*?4a(c2Sp2w(uIzl z4bCX4IhnVyO|I#nT0+h{)&Vu(x@p}}l{DDxq#jEMzUmJIAA(ac0UX40LO;6>LsI#;&!QsyT@&K-}JKi z9A|i6F(#KlD<;-J(gowH>=;?}gHb3KbyxM9#X9@wv_RX@cmU`URF||26fAsDeY}<` zbm@d--j3eV+EU#di)C)CMVE;T7E3+VQWq!x3W<^Akv6DuxlAioJ_g8;Uz9YD!Iuah zM!o~#!7(DSqjQAod5obp_UYL-qAnbm;w>+T699qE8PVklPR}m!=n)sH!O1&fBdT{} zwS!5J!T93`gLSJkn28ks#U$acJecifF#67mRMYFKTj}x6Qevf%b=_MW^Y6JAeA+8# zUvRzuB2e7v`oRlTi7xG-YF4!{I`GxE_Q3Y8tiji-cItrE1~{B~vr>ChzIKyY3{I!J`qGVk`R%7p}tcTk!l@1}oN2j(@r zqgdpW+m93j@($8qQV}2# zmBu?78jpeyR3+~359|SuRH+}v@b&a3VyWe}1+JpqC|#>5eYkd8AEoY18~-7#I^cee z9Pp!3X%|#CPa2G&V2jxWI!>&|x4%obp4%&j2e2_@)@^OoveEIMxpQa(hzP-P)pooq z1V%qStT33SMl4zsGiS-1H+* z!x8QX)Q0s^4VzAqD`m-fe@PY58FH+(`@=MA)#B+SVAdM*H~5rZ-b=Lt#P;`6&3Zag z!L8?<)~zmq08}D2&}l2vWbJOcMAc6_NJqPo@1MLx<(7kMN-z?+CT=BibImfB*bwih z2DOKb&wmD5_-*aRq^gdyvXEcJ}2Abm2=nX@}S)5@JiuspI6%M#n_Si(e&b|~u zCFX0RDo96<4a2Yf2psoCE$Az6yqI^8-&A}>&=cY{JPoX=zJi~ib%0N9h4sr4S2XDDtJm$4FtQc=rrS~3C>MxG5F86;y8kDK8U85a=g zFVXqjZRzpfSYG1wFl(J~rD~1P_zqX9t3l+(Ua2n1tkfYm(AQV0f_!P*AHvo4q6$?= z5?(W*tgBSxPVyZtv)FgJ!bGU0Swt$T(D$IIKH-haOkK(S7(wP4SE)MY=H&>2)|mFE zDz>^BR%W@fIZ{zSb+u~an3`gYikA7acydI}I*Yp?hPY8ohb#@Q=A)Gtu>S)E!A+`! z)U`E8MdLmii5Q)FbA|27CalO?J@XpX+@+l?{{c1wuG2NDo%kzIxkrqQ2dm&v(7~Y| zz(z*5=;eKZl7NeeJdIi44*eUtU|ZWWlw{>n*q~8d`x}kPUf|H%0@g zqAt}P*Qq32#j)o)RpC3GtN+)f^#whLQZ<~@LXy_d`sE#iD+G>LID2+mYSmEKx44R2wP6%hjwc;pF zpfnJ{S6~ZQtCGb8b!cvW2A#&n@%Cb)a`*%F|AZ8;-@Z{b)ZO~4+Mof)Zd74CrN6qT zDx^BbI*2iWY9+JxA|eZL8u`@qw0^3Ee)a~{$_4E02CDkY8`K5=e}PgL1E9gl5)Z34eVi0;llTfx^adB>v&c8)vT~MtQ>^CQ+5mg>(YJ^+WeP}BtM8*XQ zJMV8D7_DX1<$;7G|)8^mNpszFNYxgJjm}CCM=7 zeRGRynSujAILL<+I61ef-pa}KSCY!+lX32BDo;5(h9{WJDouaBd(2DMGoYVmpNH$& zx2p3pDrSyO7A(>bT-j)d9_ttuS5(E~3c+G}M`Fc7Rpu#zGAt)(T$=SYX7B=h zmjtmt<~MSU0CU0s^v*lLBxEBbgi>j`Ksu!0gSvQ-%I!suCeYDZ3>)?g9M3a50ETIz z9U!_GCg>h6F1TZ%qk@XSycmY;NPp6eMF^U1akMkqmjrrAYsODcKm+TtOCZ{GwB!N? z{IX?OM+T{$5aqiLh8b(39y(YRUOr;t3n=X=hCGO0qWwTN969iEs4b&4Q-*{R#TdpMI%c*mC^2rWM9d!!^f`%0m+}mVUuYlpH2+60 zKuk{9b&Nztya4HX;7~}JH|PZ;ucKT(eW+^gM?3n{p@=LSO?7NQ{pT{ezFW{R{W5pWaS~beT5T`6CTvzgq)T75C8-um39+TqDuLh zJ5__aeQ|A=328Hzq|nI8qqb{s_2p*WeVD43YoLY}F&Z|E{t=uF-u(ArstQ#%<3-w&t@=r9u$_AahZr=!F2URm-(!+0XDcW{ZnN6dByp36Pgw! zBZ;e7J@Rj=xMX+=ZZ{$hq{7#L0$_y{ zW6%`1qR%=!f%2k>E7cF(qgpo?hpucU=Q==C8VaC+)5YYkuT~iY>W+I<-GCGQ${Lbj<{cZ-GkpI;=-za*mx-<+aBv<`3S zLVlEzvWozBVkG}b;3+M)sVQcDg3-w##X#T=KHM$~i(>FZZpepp^A7~SN=487!8;!4 z=oBmxQ^n;mEW#CD_d(k6Iv2Eg#iowSOd{GD2J5wucNxixcR`1Q2ZX4=Ewtk5e2YVaNaZJI(}-*5CYHUE}*I zq}%^PHRuE2ko@p$E;RKy*skc4;zNY}6F5AyE4OTbSdo)a!gEXfgI09^;Rt_R`-&btT(z!!U<(6P zfN{9Tc(&J!4`n_XuIkp;-|`!z!+T0Fq}gWpIJQFJAQDGB;>DCuB3>XVP1!#kzBJ&U zAPAta4A&a@Pu13kENO54Qx%m)Xb4)RZ(dAc$ir%ug0~<63d=ae)BjZAMT z-nem1z5>L~S5OnDE=%by_p4@!Lx9R(>!J6n`ZaLPPN~P!!NYj(|E$u}?pL=$@I+Z)cF6F!+|*dPQxOtmi$T za_Zr#ISxyFfVn16$ZJ7@VpKgYsM_^_x*fryJ7*)T>+D5?aCb;K0f4Gtd91y0MnnOaV`@7brVXOydkrGRZTMHsdg@;#W8Zvk`f zjhETL#`?Vpdf1r$`TCo8dL*^}bx{^%1~URMW|+j%F((+(3~isWJg1mk0V|Yn37VX^ zOm`chn$=ig;=+o({_fW7cl19-sInUGznFuhB1qpNm*wa;MyLiIW}ME(O%&6-&LQVy166w@_F0zIC7F9+daOa~+Hx{p+KYerYfY)CzHq?(z! z?S!0aL0+iZqtxB`OL@Q}MsMWKC$JN!S$gIul~ev@i10LuaFpp|8gXZgh(!jeaAO&n zzID`GnIu?fjX7x!($MxzdB!?(AS);)Slq1qRrKfhc{!1{KYj1~tn0B}8l4?^y?uPN z#O$r8r>}ZQ4QTGn2#WgGuLlIE9H__oJobdG=fgctCtlIpA5vxZ@n0kz9Kd`KzlfID zQv%dsG|)qK=e52tTjCeK(g2W#TO#nqG5(HyKbtqD=xax-X0XbS9F22*H|QCoRc=$9 zZxEbFN0=|dn)>owIjjZ1PO2EQKy4ZS1_C)r?;5R|HUujSkTRJ5x7I1~OJ604gu7)r z+NxVWta7{cV=H9gyyp+pqYMR*9tRYf34cUdy~jBukFSf7y+gWI^N+N(nBp}jsnMAhDm&d3sjb8yH^9hp^L0pOu znnZ;(aLOe}0Te);)W;CTH%hmDOcgLq$z_kJ+#279+!NFP_n2x}0BCSf_KL*cmKfU`g)uj0xqCxN;k{~%pf><;Yhc4lNh#In_gs@nB{#ZmgP=Uu#X)JI+ z&Lw6}7k$@QAoVCceypm)!Ob44uJ06A7*W z#YBvz?1z3$B@5On8l7Sl_r@wZNQMzicwFUP@_opxD;Ah*i)uLQnqakLA|FcB82wkD z;g&a;)g)2mLC|q55LX3=ivdSUjb5pbKCXJT{Vv4q7VR2kA*_%S5(tha8Nn)aNX*iA zk5dC$Fpkok0i$FFO2+>pvbV3Y?0tHisvj7g1SSk21M<6W_JqnC>`3OIPhOEqW8<)9 z&4T1-#3snMfSRwnD{m!nQ&1Vpg*o}z0trfg7F%l=42m#SD6o=oiF2P2$#B;bs;qZ( zw$}QWGf`0_at6_eOpaFY4msjrSr#qF7%%af2rIo}4i9i5L(%Y!PpX0fr%P-H)2F+@ zq$gFV?ExlnV-Nfi4NL(Nc&yi623iscMMjLJSJQi*M107ZT%9yt6}v(JX33bTrRdJ% zRROm<8zpnW1OVFG#;f}7w_N!?`q}ZS{S_KXHX+nGE5_BLSKVV)%OBB{uu8De00#?WBfhUS67-~+*Ej(_Lr;}xoLV_sFz!UHUYsaG<=a(6IEDgUP2eGgX~Szz^(laR)s z{{+<}ZF@xi`9+VPph88?fe0wUoRTw-&*@zk%ai_eg37BQseC8~!XSp>{W1Z^utw>U ziJ&?!=w1_5eqa)I8?XVk-BbE+6XC2xZb@!foXue^<{6kXQ8g`x*e(&yeydfOil_0M zqfyW#?r$7qVdfwH=x)>vYtaV?fL|nmEW!UG@RLATbxfvMg8W_bJGd`_dBPua@s!FhqEIWN0htDt zIhQ76`q>9qiS9W`)%$+~|27w_ihy3QNXS!{5=aQ(0w4o0qC^g-oMkD_Oi~4HBPfKi zgD7)^{HLRHG_bjO*AcM{_{BE4AeTO^8edgCjA8r?$R0r-6j}VzdyGFft?!^#wm_Md$(% zz6e5&z&_EzXH@Q=hU?|esM2H;_Wq0hH)_^92Mqg7Rt1KdVjP^qh{>vX-l#+(Hvt*q zKe>RW1G*xun)a0&_)PXJj8+QZ72`-uBmC0<5R9s4f-$EIF$G}AN6ELMkaH^NnOe2@ z|JGc~|9GxgILx)V@qd{eQg!0T&pB~I%EE5r$%vG@BMLIT`g+*2s`Z}+$?9j-O=&Yl z^8i)N{= zH>DH&>K;$c5_B(+Fg>8f6)-Ikv9KQ9QMu1l)v!Jc#h%L|s5}t#5KI!*(N$^KU^he9 zp<`wGREXN&>9?k;UKfx7f}y;?4b0L>0cz4xE?>m0QXd9ppoAOaBy5T_6I+(o;OGmd zskVQ5v4jULoQ9zG%@IQQi#|2&Pw=45&#Qbl58`}pd0u!>#q+9hqZcF`3XDc52-F&Z z3waMWvd`*h)@M7aRN_k=u|E0JRnzM$t&hW(&{32x^@#8#lS8Hokvt1u($l7cm#@+4 zDb+N(U@)2JpQfw6want9X#-PSHKebdfwWu>U#D0~SmRazeb)=Bw9q->BT@)g9#&VJ zS~TSN6idgNT#c+Ip!QSYx1hGYHQ-Ugg+c@fOi{J zTN4*A{9(;B-jc+c*?P?j2o`f(0EsWE!g|7%sBAM7iLx+~Rg))yLxC;nD`%>_%3#I4 z4}aKQDlciOcA&UH;ty-4@VcjJYtBAL&1AVQthxo6b&i@zyrHbxK4+YxW};kyR$ZS{ z&ruVOx3ly)`5ZNI&h0EUC!M3Fk9TiXJI{)9)b#T9I@ZkA>9f^&K%XA7)!!R4X@rES zLDmHM!C5BAusq4lNYPyQtD#pUBH@y;M=m)wTb22|_vzCAs9D}O^}7G4OL1boV2(PS z$Lw_U#rq**ZT4sQp`OCDkbt_aUspp>>iO5zt(CEG+&M;#FnwaKYMu7O1}2dZ z=GAVV>fF-F0%=qe5L_nAkObACWU5v;E){${vsgr3>NV5mAz@X8-Y`$)G%I&3Ie1S| z)f{oa@hTjhoNY7%X!lHRiHwxN`DzNBn{(!?T;JZ1UOiuS@c#KKT=P}&WcjVPzd^3R z;4wXYAxytd>Ank8i=smz+IU2R_c3%(B+Q+U{-`u@#;E{ydrQt7OvLD{DI!sRD^Sd zuK?b92c98+AX6|5s%t_UAYSlbC=f^|a?YQ{t9T0nH;yOsP z$@7c|Q-cvS75(?avWGl+>07V_-lq4yWe~8=+f@-T1qj&d?KlK{;=d6DEY;JNss92C zuV1dN1{S`)TwUwkw#5IA>gP>2d6YOvgryC7SC#5dR;bRYuK?(KlZOVM&^1@8;s73l z>kF95KcJ_tR1MlsJSov*00)@zZpmnXL@KhO0k1jl*Rr1R1;2zbHhKgD$@BE_m8wH;tByHa)vfE#)$4EGs=fAq44|qu2;=hb((f zb!o7h(F|N_4t*0FvC55lm|h}Le_jl~@O^b&jYqvD@KkbT{MON>y(LEkTyKxQuSzlxhJ-MS#}@Pi?&HR*R0&Q$QI!CR zzH*hyHBYqN-n~k7DSv)$9XKh#p*RHg0P4jMKHjl|bn!GM`$01COtxhat9)X&g=vEv z&}T(k;Dfsb6r&2lR2;Y%N-_{idp>ComGPCMYWaa`9DtD+SmLz`0h)myD9b&txMtBi zJ7TL0@p(eGvqn9O$pvpFcFO1h6<8coY9#tR9*-BsutcORuDM3#Wguoq($m274gY!j zHL86EGX6NrO?Ers^sRZiVvP#c9161?93J?_es9wwK33W1hp33dPzsoElg~@U2z-{r zIHn`%gYYVkm5z)LtRpK*nz}ksk36kvcbf46g9`@oJwU?L(eMcK9s{5wcOI4oZi57i zr1<6L!N+PD2;6I&g-0y5%~gS6Z#FS%+{3 zBxD-1&Ln1fXPqkWpS4p!5iwWjH1Mfv6zvp5KzI364MC@~KgD7ECHjL;)kVdd->!wo zRD=BzPvdjqX}|-p^ALR1WIghj>`uXX{u+r1UOzJCffiZ&ailk3t=pa!+$PDSBX1tw zUW0FdkTU0aby5CZVokgD4C`a zv=0L!WHc_DC-_V)$v6#UG?i*uXFP<0Pv7vFYNMarsA~2&OL)3Ox;qu8Zm(mle5+<~ zq0tYla%6%fg*73Vu-@pM8&%ulN+YagX)+Z+$&e;sT>H;d1K)QA`Y)fU-T{mqSzbBz z)q3G)s(J9+0y!8L9j!j_nd;@kR6G3-h`L)}_dnIJ^#tUU12#I74NihDSB#r*Cd>4L z>kOlcJWkSc{--)LBnBK39_K;$hFOW=_>__ai8YHvT?9duGW`+u6oovjn&{GNGT7NSI&%I z6<#PAf#B(op7%N2yG!)y&ygr2zOh=?2V5(ZYvkm2gph_lMMLlgw~F(a(lQ!{jmR6= z>jlMzs96S46VjB2W`yQ+&@-92FBlWP8{pf>Q3&G+2|)ub7=uWnof(EDKq|22?0i+f zx)rkA!c}DGRJP##1rz*ft3tZPSp+(!gv(Ek#!(+@7ufg=cR4H#e)>`M2H|s&}Tz(t+4`QXlkwo4)@G)tdUq z+%MGN8e103;7W6&;i#i-v<0a&&n(%w1zHf2b_BMnqH>e81Dl3PJBneb!p4Ao-=XkOKxsW@AR28*kP2#kc?72iX?J>TVxPVQrW?4X{TS5^s?%T98n- z)zQ|AI{1!z@lFrCEu5mC$4F|-*?}32o;xEEN2 z-*{YazS)^21CEtBsS&#pru3B^UW}zLouJ-KKENE{?G%;d$xvSuEWLl^p zuib^mEsVVNxyn9!03k|ogM00x9MpEJjqkrfCDC2$$FH)ithm9I&qJZCxY2!%LfLVU zc5o|!lf}m%@f|`y)8e{6iIlj3xbF9DCbZnJ8B_jHP9@+xdWwbI3$bxC z8*+Dl=F@Coomkow*dg2y9kZB- z?1t!vi0TT)L3Gjc1fLtCCmzPVD>Adl#v1i4C*}s-k<&!541q_vF^!yjoMw<3E)ea) zn_O7vVi#9^+@N^EE zjuc{oy9n8X2W(wFShfv=m$W{BD$_;LTC0B%EhAVh+yWkz)sg}Gxz!P{t zk8IkrAfaq9F4)=rO#en@?~<{3f?rW@pTzhcrazSH=tS;`fS`j9IR-6oHJ$mr>dLlg zuUNWIotN?#{{BngJAK{vsyP&%hrU<0!6f|S_eRcXv_}o1oKvw!-RS!*9e48~SO|hm z&An<2?5UIYs&2mD)Ag3UY7~t0fB8Xm$$Zr>;gE@p=%FulgP#3^D#z3 zU;Lm(wRTG4^d^fzOoX=rHv};}hkpr#?8qfSl&iMtu|KNo+QpSgjTJ}^Zmj_*QFMZM z5K6K|UP7PjF#9Jp80NL|pCGTfN5}=(ptt=L9bvLF!oWU20Jj^deX4K4GG6xpGd=Z7 zD4N0BD2GY-#&&&dpJD0*K9b+KsP<_jOWfOpN_N)A+qPs%B?m;st zjL0!9+|T_fq2`5v!k(@A;C@wD7ghplC*vlQWK)-iDjSDXsjT5(#nC@zagEmSzMz8e_)749! z;cAEI9iSKdtcovu=dhm;g1rFe&tOrCMxy$x1Cwd;F~)|djR;ng#oi%YVMO7eGq?=0 z52`seB2b{A4p8{?plVX*ct~tpiBS+aA8Q=KMG7zKo`=+BnKDb-(dbYDEEee5hg4D5 zUl?|XsaJ*rR1vQ^x5YC8RDea^-x=AS=3G?yX_Xsr7Kz7ObmPOSajQevaX25tU@kPGr2M?=Dd1f=a6k<}i{cg7=ha_7c}uY$wn9DO7hJ;f;VBg&dD(d8_Ut+d ze=wUy)qzlKKO`|Q6!J8|uOWTqC3hBiS7>!Y(eFR(gt`&jpzIwaRo#68Hn7`t@Hf~2 z-qekMQ{6#N@AysiuIZ!}$K6@5=D<_&{%@*L&2bg4QDkC16OUC=yRNjlt;_{ zi0n~<{4LmMpvhBds6F{Lcj^oJd9PjAVcgd+nYg>~vI}4gY-DsCBr|pn?$)5VbgeVn zcvavF`k>do^I~!w&|Fv^aHfp3*Z=1@4|abtCRUOVN&(Y(!Dl~N4_pE;WE^soTXK*> z>R_F}%x}{a{G{J*1uFKA-|mG!sR{Pw_;Y=NJ-qg97>LFEKA5+(?Xx-|*W#W8yI#SD z?gj8|^;3nki(n?!KMYd!lWCFCVAdJ5a`2*QeH;L)Ny1UuJV ziFQu;=+~J@(Hud=kRM%G2a-2WAfay`Hee(G4lUt^4f^OAo!NbeHG-=%!w0L2ISL$d zdw0O-pZp!}JE!;fjz#nFTFdui(L1sP7Ta;v!h$qJVi?NB`9fP^3C~Kn5d6ecc#DAG zU6Sncab)7}Np>+@a+8znzP?d@eK^T3Z34?*C<%tSQlLqynCVjS)Bxi~FdEYPd`%F- z_;-)KDA_K#9iF`68Z@*4QSm29YOsE8TzyQ3&NkD=yV3^DgK%Wk5LcOaM7a~JgHJ%% z1QqNEXUs5cP!cS_du_6PQH@7Zp*j@f{}im}>$)j+QE7Qe8qWbCa~bPE@Zy0J7`=Ex z2*y?$;x-Tx{O{HjyIEtL_V9*a5>H_%*zI|81ufi{Z5(Z~a2HU5_4sVJgvNwZtmp@k0=AULfRKm!5W zdbtQ|db9pdntkIfzv7}QG$%=?#7Y>DrUf`OC`xmHR2MuDb=YsUAEPp(pu1q*6R*%u zwN4KW*u0}?Qoz0y?C3c*CEF{dpKTuiroQH}Xb}8_UdL#*I>0pqyFIQ$OzU-@^_4W5b`w{OLeP^cKio59fOuG#pH)h(| zX$Qx?mIxZ>g?jvRrhN^P!h!r^A8;;ECawLC#NEB_1qGbu-%I#|a4Nf3{rkT8N zwtWxBzcw30VYNPxZC{opDqQ< z-|;LQd$sdQp#!7G(TIb3%3JK=Z&+D+6KQ!4l#A?u!CS}9h7?k}j(rCQFrtp#004Zc zj(zdfG61S?s1+QO%za0l60>kD@X40I4`59cz;UaRzX5O%j*~=EL-G>YDicW32kNf5 zc2D**Cf6PiH$yCx%<#8d`yI^itvvf0&ah^_-KKnCpp>8C<(2+OR&m{WS2h^(8BYy+ z4sJ{fz#d+G!AP;-mZHEsuQw5gH?ShmPT4IGl8$@eVmfg#fw(B%G#uB1^mSFCT|e&# zlrIoBR6^)9efnfhEUKR@wA*CCl#m2ZQ4*Lms1s}%fq<^aw<$Z`bwV}OJM-;!z?At1 zF38qR3+%Cwhu}Yr(>z_Z8Yb zntmewDP{$+Du&~d2O#-$Zy>M?hnC^267XzVRZ{@oudbb6chyoJj2mddk%mUazYW^^ zSTfdg?^Ak0UAsqNb=w-WicK%jhw9qxn%w}PBj%+)xG{D~bW|7|tuA6w>fjrJaR&D5 zE9%*`FMb#U=W&@+bR*HTCE`<=<7P5n%c5V)YKf9i7)uhn}gfrry(#PvT z=;)*EBD)BG?kED~AE2KtvfHQrnoJQU0X*l6BD+4`o-DHK79*n%N3a8*K$k*7mvTv# z@E(&1zN^m<*##v-NS1f5lPlvLa)+Zp7`~Gr1n%^kTG~0u4m|b5klnEPvhR6@c?YQ6 zeo`0F=a~cupu<1G6JpL8heNmC;0gV0$Zp+eiPT`01*ySeLXs<$?Nn^nPkZ*`x@a9L z$$ou%v3*O!Ju9f0L5$ijmKagNgYXN2Kzv(K51&9^_UoUEZ6(q~0;GX-e0y>wnn4{- zI6f;Pqx%Px*tsE`NasW$m=oz`24<&4W~)o=^L)obdP9lbqFfce z;2tW?^vcmlv6BdS6=+aSZdu=MTVAOnVi`nT!CI#)vLUPse0TVUQ!?Z@BtujlPmWB8 z>4Q=boCsr%4Ty?sbU?vlA=Z}fhScW~+-}VXjhJ*E`pd?)YW&$Kmr+Onf4W*JLWp)$( z-Bo4}gi*h|bxS4$xxO`acy^YV(`?L0TX*q5ASi!_l=K20y{Hb-mKWM$kCV_at1rqus zZ%a*?kn<7z0v~-m*Pd*h@k-b*=p|-B?D7SvWFj}K88`zNg;nuef_(FYf;~JQkN#%| z`>(O#Uf$7etP9Vx)6?EKorxiUVJ*<(I@-4W*Le`|qSHdTwoVc7I4SZ4W_0WMc4=ed zov{4YLyu9G`5R?%uvt*J02LH?P=Y5yf#3C_^Xv=K4lOS6qs^!U^VT#LQBBmy{>lmZpKRGv!31u-w{{(n3qW_#c<+*MPwi1GDWk6 zD*`83rX&E8C<0Sfz*_OB{=BPwoezIobc0;JtV|E@W;afTMTz2~ei;wG7k}03yV>pX z{vy|7z@NhNCIGF^nty;s$78zi0_=omj_B|OcDr7G;diL~#6{=)G~!-qzM_QA(RN4G z*}FJetT=|k_5cUaVqreMDDzo$fo=J=9ns0%?bZk`rrM9mckgZ&`+f`QTe?H1i!uEa zTB|?k4%5ng`V1<-?A+S2o8!-omfbUL7qk$b7%<`XkX{NC999UZPpcrj0hd&YQk_LbX1IXU|-dw0waS`|5tUBe0l z4{X?O<65#_VJJKUz;y)eVU9#=&haXbY~nt8WZ3QlsDBx@JD5A3F{3gb;GUxED*O4` zyv12UASIO6p@WO{MrB`B*W~Jxn>R_VSrlMn09j&ineJ}eO_0?Dy+g=GMjI2UW;Efz z6MlVH|6$p>-l?8RdYTQR)gZmhwmT+C;I3ECJvgKdv7mWRyZsf0dc@M5 zMGex6d)YjDbgGw~*Tf}KrV|UHVW*3znB~HUEaF4AOYBgp(E@Qlr@rkHdwb1?@-VOz z(|Zam&R6xeuk`j=GOM?JcLMU2*1i%N$jPbt@+<9OsdG*v#C0~50loT4`x=}zE4a#j zwxw9+5n&7MT*CB4P)sm6OMu=Ct4*|6_2DU*sJiPayI024ZkzkapdIH6B^25wFJq<^kHc(ok>MxVOcZeIQy;x`TKMBJhA5|=2h&9&b9 z7TE-;l!-S%n65C@IEEWsp2D+$=~4{~1(@@2SvqN@EC?G#L(geSn{QGYps5zen2zgq*P($)`o`<* zhWW4})5e?@LX@Q^ltyZTjQq$QbdR2Pon462L~IJSsQ~g4duVJ$%qNb!Y`D(uS(AsV zu*Gix#l)Y!y0j0d@nibpK6Y7t^jmQeNCvLG4u*=HV&nVR`N`Orpv8Uk{62PGGYlA5 zT!!Jr4;X59vBwY2PFjM0kQ!1S?PE7FJ^R=*!!7#i=6&t_EH(*eE?U7_5cI&r>-$38 zyFvfEuU#LBSbd09r67f-;L$Zaj}Iwm;+?*bIQ#0)``TUcC+m8w7Ji(Q!X00{Bduj+c=7BssQ zws-s%9}!ZX&c;vlW9;9IoONEn7$ZLo(XtiPQ{ zsu$8$m&byRA$K@Q z8KMeKF03_?sR@8C^qdDyGq*86nsB-2Vjsr1D;)Yh+R!-n`=7pxzOQhG|`z^8ZOavWme`Tb6xgVj*V#-0d^kk$# zwx;h%vPR69ni!mz$(4`9tL;F@vdNNc2_1nY1fgq8z-)cHJIQ*d)LOwx8@TbJl{O%o zy{pm&Q)vw=IZ?~py${@Em)4l`MeHTsExgGtD|hN5I(v0#2jpx9!i_+D9;0*~h&H?k zp?@a)Fw)gKcw^#pBX2(6!ca#>T2>(AwRIW;Uh!g;DXxII)+EH1DXu6t!(GbZ?n9Li zOK||J${dke?Ej(eJ>a7%*1z#=N!^5;kX}f3H=z>}iu87na^_e7y$T`{L`5JdqStm+ z5{ifv4fO#5DI&#!ARwq9MHDOuiUk!Zf{Kb5ym|!${ePdCb9PS>xO#u@@4oNnf4OFN z=ggUT=9y=nHqSi6HJH8_F{|ZE_+mAMxV)+r_yPf7ZVI<*zqsxz*?Ps(XdOh$&(L03 z5F>^~uWwa{z~-YED0o&?E?*`qqbF-#TDg(vo$J`3RH&XRxF@SgeWrSOuXtP)l@ z5b_*1W+P-HH&)g_-^(upBdeVc-}zc%>+nh&0sCzt9V9E-4MU4Z!$8mh`+4sw&)LH( zpC7iLcd7Ec3}81?oYtht;e44(GGU z$K|ui=j~=gwCWEnE6{Qo{FU79R_D8GRJ*HRP!qG1pV`DU&srpoXAI#aAO+Ei7#-K< zlB0+OS8?BV$?FxVNXoa2Km}0i}t3XGsd@F z^2gV1$ubaDyMm#$%cm=7x300V5JE0)GGRc=04XnNsCU4^946>(N8y9jSHFl?s&YE4 z!Z7RL>Jz!E@z!{c0cpD$=&RQ%r13LG!&1-&oUVY?E;;fhGc%?QlqlKs_7674vn!qY zln*^HV(gN0h;>%s&vwZdvJOW-+a)Jt9cO1t&~iLSKVyv8Whsb&C|JZ^eTaf}kQQb7 zGuu4+*arHd8TNQX;mcq(T*W3p#cI$_XeokYI4dZQfeIhmYweCI&lMBE^Uzuyqz9Z0 zsKu;rWGN#GIBn%gJ|*(spBvsx6B^w_XqeS3eT=xvI>-| zBIWI#!gcJDaGi1{JiGWe&?~TVc%CFYz!jqL2%Rfh^9O>3s`N2^G0gCH+V^@gLiIr? zs4mk8u!az!$bxUP(UqA2>npe{dW4)+_KhJVI%>U+me^eyZhP4TKFv_hE7R`oY0lTI1cF^O9ZWR2YSA*Zj#`JEjlFP| zPjr=)J3;;Z5k8<%zSU6=sCZSOg0BDpD)uOhSG;LsJVYqPx^+v4oGm43W-|U<^3WNS zvrTBJ4Sr&=#OtT=NH4RYUI|IFxuIUM({47jy#2DKJ&{V#ERxh^(ZJH}9)5Li=+zKJ zn$8vNSLKqzREJ0aR9hB)&b-*Je&}Ueg4-ouea(`WC5l}#V~c&b%`W-)lVluAVV-=B z$7UB#SMXK7YYz=9OtR1}!-Mshh5q~*YVWCp^4dsWbOg2b#^|THEWB36-)0n*aXlW) z>>Yg8hGDTwo{}XzZFb2cIDDnf#MvcJy=I-z0SZE^q&V~fF9MrqIdE^kjmMUhN4*e7 z)T+F0BRIsl)zB>bGk&esKnm|PlI!ch=aN329FxF<-};qAk$xDZc3u6)89sitcWTC3 zFKc-G3O8xBfV%Y7?M6=U-2-^(%+eTra$|k#35CTExh#yu=#fUVGRN5Y6`MLPFm~r- zMR!&S;IDu&3I4G03km;8)otZT1^*_LVz*N@epEeM^rL##jURHSjusq0_cFv&fewsf zFTVm>*vid?MuE}d$iBIY~%n5V(|iI%3zVPHwVG}b=6Y1f^y zmBkBFnO*Yp*fgbQfdp_=q>$ABoOpJDgpcuzZTuxdKM4{(uE0LdWg)QX!#j-Yt`DgN ze))<5*`?G+K;a-PZqa_MMugnLwo0Hnv>x+_P@5)>GMaW9&+BI46VdwKj{wE=Bz+ z8JShsB`0uNRcZ~~2eT%)P4*>Iqq~e+(bmaz>Ubtgt*7lir5BS-|$8(u!R&kSiW z068eeE-6R~sxUfS>atY}=J$4yrKmWI*zdxxJ8D_iNjZzy&|z8aEUQpziL=O(-_9a- z(^PxWQoxo-n3Y^vz8@4okc8ftG&oHa6N2*v}hnTxdXT^l69Tl!4Ca z#ywdDU@(VYN9qH=&Yl`D(#JSFv+rMHNmx6QC6zhgwaT14$trU4B&*2DlkCPEbY>Mf zS&~)cWJzUunFPbhldNh^o@6)XK)2mk%`RDuwr9YquK<17lXq_Qyjojl2E-^r7#A}3F>imLFWnk>m~ zOIbEfD8Q1Wr^s36PM%~HIeC&*WT~;vwwx@FjA}3F> zikv*jDsr+UtH{ZctfDYWsuiOC5Kn4Fk3VRnTwg8S&R=It9M5`cF6YBx#$tR{MAA@`LB_LwgNw(tFS)z67kTFBy7)n)E4JP32m6`7Q>_ug^Wh8+LD#Hri;B z&B4(Z2xs99LmD{RxG4pfuJeYi4CcXhcD%O>qHR7Jjji&*S(t6}l zX_*o0`w}NRnGLzM#Z*>?ed8}_Wtq`4dgYtE4?L89Ei>x*cOH#H&I)9n4ee8Y7YhQi z!mqR^sAIV?$ir|fDmQMcvor+{Wt0{}qb-G7R*ed1{)`%pF|u4ssrwk?4&e5sF-BM9 zGdnW|p+av`y|D;nSVp&xHG1T5E+aiQ5T$$MVFtt>^AK^g z!(TPE(acIMY&^9yZr9O1p|o)bm-vi2k24D5-yh4tQzH>)0{BOcGX{$})A+={OPdsn zd~^ImpMuPLn5ISi9lj6loIiLTp1}5~jx3G%&#P~pC=W2{^NuDVZ3uFck2e}ibQt4} zhmtWZ?k*g|Hc(yo!Fbv~-na}G(iS{yG)S5vV@@q(GQQ}BhmBVG|C|Lh+Gpc2M{FSQ z!5yA2oRZbX1hQs~S=m@+eMC42efzM{QrqwW=h;&ip2*$j!U;xugb@szVAS>SZuGPX zMsGxN9NyL~KlStZF%2UkTFXo2j?PEeM?|}b3}j{~&7kIw7_C~ZL1Xf!7V82PKB$S_ z{fH@GorX8GF(n*8;Kw081o;Ib_0Q+ilaCnLb@#i0MT7;!db;2(M6V#JB+kh`E-{7I zBlIRXnRxIKqjCDI51};RJRJ6$`Cb<{?xMjM=8%6Pc9G|hj*rA|{#jce<5J;Jd|C1x z6OFrEKhm*@pqm>g=}|-h^rKdf8ZBGx;Dikf-tmax+EjV&Q18H*qhjTK!8l|2x%+hEAX%ZpOQO;&<1S+LIROB%o+m6C8~f#z>MN@ z9NlC3O`yocLz^7xXbz&;J^x@zTl0OAp?y?KmJuW&8#A) z8e|nY)gV=bD~%lrl--y^Dq2NOJ;*9@>OoeKQw_3;oNAEWmQ%s88>`u+QxCFgIrSj> z#hTzd)gZgenzfV~WU1g*HK!hA6*=`FtH`Mb+3h=IvsL6&gRCN_8e|ofIrSi`Y*9^I zIQ1Z_mQxS1ikxbYRpeBItRklx1Q(zrAE#|*Rdeb=R*_Q=vWh}_P?!{*YLHdSsRr52 zs~N$e-0+)DJ;ky8({io$vj3glG!K6T@2%Bf?J4I#I}$cp=x zFE5qK2xVQ`BZmf77;$;(th!6D{1(B!9O=sk2&J$ujL6o;QxwNgqC`8Pw)n?%|qb}u7H!k@0 z7OPyi?RIMfkTr<5Of%}a=eem%BEqVEn`UUaZPblE`K|il zBcss0`dMm6h?w5{ER7%|H&`8=iTar-4s<30ozD@@2_K~vbBy-<`Wtx_T~P_~w)sFbtx}bB%lXy)DnH_bQ(^n#T9Q5m44G zAajq>$R~_~IIAV3-=V-FoIVUS7C8^&noIgT=$Cux(RoI0sOeSnj5`5YV7}4QI~O@0 zsLw(plOCRLTnojb;w8gR=jI!+o_@gux@|ckw);_FfsxI?bXuT*8M(mt8^0Qn*9(;6eg;{{>Vf70-KkeP(E7md6er~onSGl}6tyc{NrU?<%k=EF}K;{Z$IGe#=y zdC`cY1`83SJ(sRrXpEG@UuX?~Vf7vhVh{t3JOD@`HFXh!0~P3T@qAbWQQQc)I=Bck z90q>d(>NH{aIulY)6jEq_4evVBE%Z2fBp)*RYHF(hAOs~{7Z}gk06`~wE75cSb{S; zvh#-Mto$h>BVOKt>W=|;(Kge;m(X67=k9)4baJ03jaEM;!*@$I;Oq{tJ7$9#YvR)C zurYR@TPoq&xm3b+e5r!V!fbp^%+`I{c!FESunT#_l}{T6;Lw-DFq`iV8+o5+$mm66;hQqtNX3)aratzNdM@%MqdviHX zE}^$G%Z>g_A+d@=?pPryB#hgv=m>k#I5b!tT5tw z4NF#1NjGPs&)|%rB=Jil!FteE(zC_~sCVpHqqFsT8nu58kO3mJkxsYaM`-m;ea=Xa zwR%Rj<5L?9B=vdD=!DsidfxCyozP?`bCc(dY22D)CAQ44Uc)U6xStdHew9@j8(NiA zxdFYFufkd^p-rodK1rOg2VO+h#;x{qUofVsdZQg+yng)!VO+6Z!uaue3FF!I24{Q%Yx-YYVomAr1|!M|AEOSdEQ1a}0BVRU_G5-GNOD>JReZ^?-SJxdgCLBt^ zDOygy77L3LrljW{J!g~-C|-P3Eyc=(Ai;C58u`93(Z({hr%{(pMkEG}Whp15DNWgA z#H(4!q!%|~P{=aA$q3j>;ru2!EsZxD^)c$JHyaOF%S?*4@G8xt{;wI+@G=%;cAO6; zd?Ip6Kr$q4!CCfguX9?OkyN= zE7>}_Rq69>NFz{6zil&$lb=rUAtAP_%r!dHDs|e9d<~`a)^@DtQu=Ybk(vli$Jr*m z@Rm`BieEP}SOrUb!)WwBQo$Il^XQG&jZOjO)q{H{bv#IkA zBM~t5+F@kWP`DPnX{3h=mm!>hRk`^)j8T6MW1Bxw6TR#cv-DiAuU>ct=&3g#{Y&ZX zH;nGZ%m3iCm&$nq9?Nj+o>4)#nvjx!eP*^UdHyB#F72kyZyGHdIno1YoKz+V=M8T6 zfu0^_+Al?7BnBX%ND*-%=!6MiH6O&j9j~UKEX8-!d8jsN3FxJyuGOz9q>V6#YO`8<_dyIizg295_-ta(fu9_wU1H)+U`( z?cnAidhcBvefrt!isGd9dlAy7@{{jBygag@C!)2d0bV+6|KRgO$L$|&@B_KID(&Cg z{Av3K6f%9{5vz?1{Mc(h@#9Ci{RD@izz1mm+wx@H=+BMoU`q6P$7oZV>&tpDR5&Rq zJb&}vF&dW*k$w2x4LwF{55gl*4bQujN??&2MgDH+X~Pd0ZmwC(KX^p^qXGZm*7=8@ ze=s!sL*pL|H2=uJ54QXGA+8=_KQ4z%z%2rgq8s`7UE0H$S^pP-fystdNSA$K_~`7r zMz`D&keE7;4@zbYTifFCRk|>f_^6Ev@+r*}8ug1Ol}2Wah@|biA$T^^cX*a_ z8X5Aj&&_+WoVFI}`Q5(yoQ;OxzT!Qc&#NgX-ha<%5%Y*GOyc(#IkjZYChUx`NeS)0 z)gEI|)}CiQNDbl9U9u3iEbLT1-&r|{R_`&2Lk6jXM$xZ}PvFXP$9!9nXRpy9v=*(3 z)NZfwa{XVQLhF!HyvE#YDa)0N9+(S6;1V!d{wQU=Z}hA8^CS;PdRGM{kyTCzw{UNB z-gm5gySJSvYz-#FO9vOS@e#7HgnT666Ch2nI0P`O%snjkwDU-Vfjm95*c_hX)yt31 zr&b>z2j5V-=K~|?non~-xIj<4KEUzt68i1~qX%j>+XtiZQ8M=-E!t2j-v_O2K0UL~ zm{9{CmwyPoeke`&5FC6yJ^!Im8e|S0ZF6vWAlFkpMM%4k!0lGiy&oChBw%=cuiT2~ zb8V#`W4q%~n)xvdgA)4TV^~c0Q_LsE)zMRNEqWw&cLslAOir4jd~_K3q3<}t=sx=W z6I5NbA#=ac-G$GRPXT(Yq<0O=1|3H}bc3#kNb3_uwO zGT)L}ZREbx17E-j*i0L~Fm(Hfn9ukBhIP@Nx3Q3h(f_YFR>c21j+Hgh1x*x>0UgUSNKHnNzeW-N`EjnbR1rNOK)JIrVuR+cG4?(A1MNx;1 zouJwG4kOK8Uutp0=u?Lhzz+7~-e(*kz+ddlNGS-?8iXs279YW>^E%Koa0{lDCl`V{ z0(v%hJQNr$n_f8rDXYAI@N|7~%JA2*J*3t(l=9Rv?=nIj>?$JtOJo)qNvpnu+5JN@ z9s1H3LN^^XS_LG3mhiymR^mJFcEzy3#T6%!?01Cj{>o8f4<9d$ggXBCG2_~Fe2>9Z zYs{E&gq4>B-*1R?xs^C5%33(qYwlM@diLZ1SU8mX7{t-6b0P7EYqb9JbZkJLn@+vI zG6H%01NGrVJgvUr#IdZQ{p`gjRiILte8Z}VRSC-g{qjvX9tnaAt*KUc_Zh6ys_I8h zLGRsM1hL^TASMTVOI)lf)!>lIg7Dy8O|~G^^`RKn3Uhcob@C_8gR*bpCo z536!9o&6r^XZVR1(z^HrxY1(jcf#lzSNRq$N5lkzS1&zbe8|_1yEulbgvR_}1PeCf zRCh}dlS^;O*}iAQ0Ui7t>N6m3!%2|G)6O4^Hm+H-Pa0_rQ30E*&I-63Ge#a92U*UH z^K&YqfE&pjJD)WE;hIISoHTNh>|saf>nHP0?S1skNuwxLj?|-;p&TN5tDwd|Vn_B6 z_4^SX>zirPkI4FSh_?S|6ht4CmJ{}uN5iueT`BFR^h)?LO6mDZNSeO%&q_$DQo8&U zWNRsn#7C`1GJVZKjg~OsGVHm#@6sO0{EyZ%wv4N;=ab2_@h4*lCpHW1A7a{mIi z@=&_&7qFs(H2xQ3TGc)R|3Xwm2~Gc((JrB+%A245%V;Hm!|pz%{c1F+`r?(p8rS=r zJ+1rIAX%TIIIcQvTpDNFb$X7<%(U(_CdD!l>CkDTSx6!I`7@4<*iCt7kcO$I-U$Cf z3cY^DXn{%k^$e2rOr?5fp$C;nS00iQVG*$(;+nHYJzrx7f)jo-0`vf?f(;|6CUsUv zkw{z5!uL9a_MbKCCx4>(o>Dw7JS&}kGx9=^y}XsTA$C*JIpfw&)vK~1$nR-3P4X43 zC;|7E_eWZKj-!pgV+0e<8M_+uv_fHZ+QbJ{S4iu4oNoyW19bm+V@vJ@UYM{=!iE>N z(~XBNNv6U-FtVXE=67gQ2WkHA#)|N-L4O!yyFy*#wT%y`{HYRATp)QWKbYtBrH4H~ z+7yRq7~__rfy&RqW(;Aoo} zzmO1t5u3^GK1*N(FV?`fXdv2ZfRfyzPX1qzIMl~2^wjbM&XO63z+|$=0-@>Hn5E@z z5$Js?Ilv3g7Ykg04yFWrITCBqd}n#jliy`H8xz{pi#>!L!w<)EBDiTUma-e7&?8!9 zZSukxbd3sl&~YR-KhAqp24*;v9`cByx^J%0bYx?Np3Hr-r2=H&(gAi0>7E`Sdfx4M z-y^bW@50To;U@SF3Oer*jl!-K7oe298ajgu`DmGN0hXi7K3>sw0C&RW++O&3=uQhv zgim@OAen70W?=zX`wKnfUy;K4kvm&I@d&P0QbV%__ow|jSf|w~-IyuTy&F7kFDM+Psm1szYf_wn&4Q_Wo$mq=Ta>X4R_dkyWK=mvMO(B0x&oa^4?Bn_4My1s#bN zZL*MfDKu)8_z9<}5Yn}GH?@cn9rBPW9+8jg{0hfA%b+y*PHjy05PB>|2wrqCA{QUO z#)vy&Ku72UgBlqtimrGGnQ9>fY;)vOQ!-1?eM9Z zgVSiDPxP#-GBRPyiLX#WnALDQDN{5WlfSt=eRuN$i1^HS(JjELSJ*G%C zju-Wt+j@tkZYk#%G!1r0W+;cGUFGm;52KYni5Gob3#eg&sFV5=hj;0AjcFh9s@+Z3 zCx~D|NJ*1OnS|QNh_@m^+yK2Rs+MSgkD^*4Q>tX_KHaFJ)evcaPftW zxJ0|SwrG-KyZrt&P5NZ{I)M_pqqgXf!by=qjS(znp|~LZGBXbF zu@r;9mAz=J(oxf7(KxsuAsDNTt&8dPBCkCl#&O( z*C22TX4Umi8nfpv+N?N^D{=E7L~hVO+{gK;tVg_pWgdFDmT_?k|Gc~uD>^hWN~?6U z1HlW=Vg!w@C0IeI$vRxSs60_Lb%of)4Jo32nw(2$o^f#K=x*GmjdKUu&GbZyxU|us zC=ej{Am#zg0e9M9ZNmGfZHdu6;0+#?suTXm^Aw#bnrA?&OO!y!$WK5Ghd0)OBDN{M<@#}vY2h?PU5-|L=9qtZqDG_>Z1 z7*VbkyS?+YJzey>*t6mcacx*HOp$t_uSr;>(&`M6(SWhl11Ym&d=0~oY&jDKeG^q? zh)%gRjC^(XE6;;ACzC4snJF|VQ}}6YwrCJ7qo^&e9yKwOd!c(X1*hv>kZH?~Iuy(j z&Elm06Eov?Qy@xY(A`<0Oc6sV4ax@5455$kk!!_q;eJ(z0Er0+kmMY3MZrW)bOwRX zA^}X7nH)Hu@|^Nr4N^jk&k>hhxV7j|Yd_?O{Ei?ij!WiAl2nDM=GD1eZC}V|AP*LH zs*>dNSd6NhE9(4tH!sx@CK#J5R}7OlV=G`(u4r+E%|no!9j;$yBW?~i1|P_%6&)GD z|AVm-+PMjH6-h%ZhOi_6EYtZiI+ZK3AY9|~L~$k-Lj;R1n}bH^^e^6pxR0*M6BQ}e z%!PvAgZHhXi|7Vf*_xyq6^2iPJ=}H<|PqeBh5xL7RH?*v#xx-CW zOX!CBBD<&Dred}QAho{CF!Y&K>!D<8jgr%O(1}^hOU)Xf7uFYbYJ=U$7<`}a9<{A8 znFiE{FnEY2*B6cO@lt)!{;v-Ztbud-^M@QDa$Hbh1JN6K^F}uiL3}K3Ad+!)$NC1M zB`D*&24b4)Eqbt_=;wNwK58gh=G_2}!TIuJSfxH6?mQ1}#tzSSgGQjKesrY6wOLf& zNcjIcaMiKTz#V8LT9mQ1F4qSq=636gB<|Q~jnE%`g?;yfmQ?Y1tLWg z_6YsFM2Cwek3;nGo&r zz9CQo3@#>bAOW5sZF-87P8gb>L+hJG`02?eB06MlS%|Xy!ZxayAc4&@#lB};wC2{n zDU@6&a(Y@G5w(Xa!DgVXRND@q(X;elUk>ym0r5eZfLP)gYxU=1+_cfRDQ(H_9_cHR zHaxnj2+-n3MO|81D0&n;?sSHS`jOl6q1mM5recu$3=-2`BJycYQ*l-FoN+QcKAmbR zQlc$zD82}6`!T9tB>ZtxGxdic$FyHG>Qf~060ABrT5TFVR3r*RudOK(DJ}Y9Zq#&Q z^OT7g(<%9#oK5>7YyJ=`7<7a-mrfU9Q5>Wrzm~S5n~Ft;cAIJpM$UB&(uBJJtD95c z1|!i4C-eQZSmb1vuzjPvYSye`Bb~YaE*Fg&)H9PBHWO(fxO+4c9kRpYvdBR@?2}|L z&YI0BH;H80(F_))rA>v9Ty-+Z)m)^we=DZ+<{}UA&`0)mPbRau7#PIui7pTo^h4`g zoczXg4KjO&L$J4XM2_>5&Bg7}-#-Gw4O0207NWytU#*rwJuF_af(n3Ac~}<2iZehU z803dvqiR5RMvVqsLsj;x8ZNsAeb+*?sZ|S740M0Yjb$<^lL9Tp#^~?RBU{9WTZ$rQ zk3d{Yt37;eqT2J=?MZDN&S9>Bbf&0LTn#4be~GB;K3&XIw>QA!LNB2;9E%C6GOu)J zE73688Zj+tCF)08gQLBzM0V)MPp!ZYAEV;dqG9Sx7sowUp*L`j+grnm`hq667I(vx zb+r*9Wb5{619G>rN79HkB7h28x``Zmrj2Oa+Tx461um!NAt@q4JCMvOG{`)rJ&ZR( zrUu0}48^xahb7doEja!Py1cDy_V%_SuW+yOn(>=X=Mvca1(+_q)mAh^1HZKuZCR8< z(1Y>I%QEk3Cmt}Y$vdhh&o|d~A@Fd{tR_2`LKFNN{LiIffwzb566)Z_zzrERvAswD zE@rnEHw>J@w~fU3+JaW9f_+g2h%f{=%iu{A->p1Cekc^$C zcMw-c&;C6LWWSM4bPxq)A3x5yquF?>0L<3j5@f!<=KI>r%`Mv&b1%=0D?an@um3`p zT?B^UrY_Z76zG4lN(!&?kHhAKfYS zOKR6i1j>H@9XF-1XGy*QYQ!k9x!{Dc09JwIh5s3h>`N}Pz*K^dIUes!BDHQXLU;E< zqx4xP;qNxnh2KTm1o#^L5g3llO^jJUnp@mDf#?V8O{t?-A6tPnwoaWzP9sOy0&^5F z9Ec_Bsv%$qgOkZW>}UoI7ygRQ!r$;Ozev+YUYq7wy?H*Z8F?*?#V)Y5!bWG9#=t5t zSY*msOuf2@=5^-GWyknn<+b%_&!(tvF8=lkCB4=^9R&PR7tu2M%LA~~ao+V*7m)!i z+iUC2v)ku`W~_^a)2X)(7hoyfsteBj8(wZ%Zsdj@mC!Sdj_M*KIppOD%DD|j!NpRm zt6ZW<>+}7Q$UhHN`?jv4Ah1y>)vH|+bwC$%V5Tc5FypcB4Bqr&S8;h01>c=OyHcn! z;A4@RAFfdh@=;=_MmePr8jlIw%Wo=p<7O+%1cGFs5h_&r=6wx-C*Xv zL05DW%|mQ%LO0PyakggoIE6DyZ}VQGJ9~<{TE*h=Y+S=0_uy(s z+{v-LC-89ty|8J7KO4!VVZ089%e|jJO4?CT_QcByk+J-U`WfPedVc{ZxalbHQ(>Tu zgbU{mpuMpVqD*FvW5WCyhe^HIJjN1nLj`6xsN%gA)wUFn2iASou+q`@gF*~+Iy$Q( zgvZ4QfunO56=rz^rZ0>94#%g4tmslRsc&dO49I-P23>Gpyyo zUJj2<>Om|jy73={IhZpKNN!IrQMboi&)ETQ%!@$BYU2qEi5ZX=4qf z*Ji>z!4G8Nhn~}}x9Awc)ac$Y7M`KGy+yzSKxlJsC}{`3Nd;3HN{4!j79Pw_)za2| zL<{#bDKx*2$f_0MHWHN-xLzdJbzl#{BsMDTD?BY3PUrfFOH!xGdzkqJX-z1AsmE2K zQ_5$!{UU;cAe?42*tm3adtLKk^2<2X$JS4%CV@#8Z z_drzHo~gynhx(f_mG%og#I^$iHo=Wk1u<%b$dFqFe){llqA)!~4Sm%X+LLc$}7y5w7_+Q5rJDUF6^MNEH|MfoD0sUVd z2WkC?Jwfpa0{I3FEanvRttxE{kI3jE|dRuAFOTvxBCFk{V(^C z`(Gz8_?Ip+hGaSkHXJ=?rQFRSe~HMnd0-(SX5l?}Qqc&XZRM%lF?NEQ+B! z{x;a@U4i>1Y){^ElhCu4e89mf*6tKvX3suCA{sI&h1~bN5Y@21g_e z4%_zaFhpbqoMM>)VYgRRKzzeRUMf^4w$qhy#&!^Voh#{?A>w)TxOzy?9|OyVFJ$gV z&2H(NL7(3u{2oL#R_ipKe!Ep9XW9GN7uXE3jC6_h4~AjKtCYSUh6oGWgAHiHXklGh z0@8W7xDkLX9xfVr`uQWtHK%(j`9HtX8yi+$D)A=f`f%dy>C~iD#QquWJ@%RyT+5|R zwli44)S;qMNr+dLiiV-N;hho*#3QBHX1XElg4p)RfGm%N?M%7Z>B|QdSROYDj1b-8 zq(f49$wrP4g^AU|tLWJgqE(p+D08u|ft5AY)T2ftVUy0K-XjsM@-|hB6tI!~d;%4)VNtzJ+eV6v)Oi74vP2~=Vu>h) zhS~r(Gi*3HQfRKkT@=ena@9X9=Y&zBZ|XM?QanB;Z$0ww!`X^0q5DUPqLlkt2?o#L zk7$IXyx@hqe$DH*Wv0%-U*cS3LnqhDXztb>n{1x z?=JXDPAxW4a6JeQ+H&1{cP~ixL;E-ZZ9>$iAH~l3_3w zDKN_T(o&Z`5ofrn@Bi`DIj!7txUC@=6O4c=r<5cL7-2wyTH~*(%|LmC>D$;~=m-<^ z>-F@?-!Ypd^zGk8b|LT=fn3nA^VvR*(A!`GkG(mJPdLm+kJ8<6oZtcCAxfy(-Qqgf z-IMQzsa--F?-u#R@2Inwuw$Gzp<_lldVtTc?TD-ze(JkN)cw=&(_Z(8)}iRpsrQI> zo&F@=RN6lQ?4@}0iAZuB!&{lWV(bXi$a_V-bnCo?-&5_xMAv%}==Ucb(1Lq~8LD)# zvlmhKIig;h-Y4pW-ndwt>~K`-WGO@TPijR-M~S@@=iiSwi;1-3elY;E9r%Yxi;~;^ zZK%%!h-|{avVVwf_*ktzeo-Io9*~7)>SKrch-h_PMa$0*DY6{i;0bQ z>!haz`vLaqbA?ymTE&Szct{kvckL$6Xi=E6=Y8otQk%V!S-^M0Xez+1ua}P&jrgec z^J|0o{JCH>Gy;6SJX!?OUMWV1uj14=J5%V!GLg$LjwuuA(H!{7ClVHxiKg8Bo-!f9`MC_cboiZJ zF1qJb>k?V)(1TlbNe`BbHeBqkQNf_`TYBg5e1$i>1zBt&0y=qttYKEFULs2t1wy6hJ#(sv1 zDNq6iN$lPZhDI92 zBZWl}(!8q7!H_GJ&xzW!YLYY(sc^ESAfJ)6d#cE7ImJ3m^XkD`lBU2dK->{}%qaG=;{($j z3VMH3RieDd5TyAXb$Lt_hNotOQi?XqjljP=lKqc~`{Fo7s#|H>Q}=jpM%>_A+E7DK_vgo(Qpo* zn`8~{EspqP?H=m(Z`5p>sA~a?qd7yXuKtSvyl$H4+sy%R6DPpPBgfhvx?;H@)dr;R z)A#)gC+Ha`<9Td6CvcThuL>NGymh*G04I>DpvpT#1hc9V3fmPJ0>nWb-fr1Xg?e3#>4tO^ZTk0ZH9xd!=a3tlRFchhPTsTP2> zoB-~MkP+3h=ZJi{!^`_rjQw=05~EoTgQqZFn@!ixfg_^yuS0jmTp+R`NbUAiZgnQC?ZUAhRIQZ?&yP?S7i<-6%(({XZMp|3Us)_h zy4F#nC88T&Q|*?y-R@a}K!dgP+!9FebElUud24SWru<5lJm6?ACUEc=pBDLPiD;3% zl;f>9eh3wj+{olw?2+IKU7ms>^9q$bB|5m*71NFDN(){4>7A$G1(-pno`M6YgyNRs z7t&QN6(XF)ddyPMi;p=+O2$dgy$XxNtHLHfTPm_@3W$`a#mgAUdryl%u}zAW?u9$O zZ0T!d+qJL91J3beHNC$~q+j`G$YMH!U8(2{hFo4buXO+jrVt!MU@NfxCCR7L-j+SRbt1I45oZV>nCzt**{2#g zl{pB`9(6=`)ML-_>T)h}xmv8;!c`G0pIFI>Lr;8+`p2vAW2yFYbTTL|NaI(Eq!4qS zztYK^XRg3<3#o-)t`N=La|1{vD4Mu87AYzjwo(Sf-MdocUZjz#9KPc-LQk3-@J+4) z(ZA!tanCw|==ZGXUY!GMdR9!SUUutqf|Hp2Cz2yY^!@Fr<_}h_f+pLNj3@N`XuHG!hdVQ(AZfncbIetYP`V$Cc=n)re*) zr5{!!+`#TNagA7;P?72Gq7)Udaq4r2$fobsU`CH^ql_2Do!M)_bU@Y_dXx%#cQ*R; zi=ubr4R-8AIwh?Y86jY`zY1&>K;;T8U5gN)QhIEyL#cjttvq7sdRb(I2H;vJdNH6^ ztrNF{b#7ZHT1CsG4G{Ie;|Kg4m#h~B={GZm5c|%X_VL3d3eitLx?{ccJU_l(q&e*n z7{C>@ZoSZ>4}QynYABss51U~mrN1Of(B{1_iEH4HTs**?Oov|*(e?VtLm`NBfk%>8 zw$wV4u(Ctf!y*lnwNhSIE5+B^vG7Ybh=HNAqS2Y8j8+M3NH}$#$W@hI#B0g;DCHi~= ztAiV!>c*Qy3);L&GTvoqdWsu4(% z^|#HUSyDwaW`-KF%edGZJ1dhsTf`kWkFw?yIB#as{?A1NDs~O`7Fx&QA`2tH$T^EO z4hZwhSfv~mBHQ5o)tQ-ps)u1u0w<94+lVtoP5IlzJ%`&9S70o&vUTKtBn z8^lp+=q0kEwm*+G6e-O)=_fBfZE=7OydmZTKbXI48njc?it$Q=5wWSyyb1U44Ep3v zahsz;D!$*dQ#7e<%?TpXm}z;m7mH}!P7xSho*?%Py=?-r;%78!3OGX}xv#{&jl zTb1Hl;D&Qrckxj;y@0iJcmg?(B-hYRC-Zq#{>R{!*7CX|TrPNn)HCY5OAK<&oE6At zqTjPCOem7V!005w&miqB5ojpT2a-3mdWL zE^nP-m6&IkK71RQ4`lWt7O&RX7PiWv)FNq-vd}>Q_zq)?%aOpy1u~M~Jvimr;T_Sn zMlz$R??^@Kop(fbSw#}GcolNa$Gq8f$9kn6C1ZGbK=`Lkl6bzY(~2`^jSJ)kdW2d~yjS$< zjE;ajXGci&Bv1b1IG#MH&$}tCb7+`Bfa2$a`d}F9E4{W?I1@X4JQ?r;*Wd3IMKN-H za4x6d`|==rZ~iz$qu+;3dWaUj4^R2cwBvp3-rP(HAHZWVlRAAM>c--PI|v~j!NDUw z5OZw4;@^jJlryR2KG7se@fDr~TV{^hC;ZIkWh^7>c_FSGk{ah}^*(VYG9u=GD6UAU zVOT{1ed9kA_pAPxTd<%?v{+cEBNkBH5tFJEP#5Y5X-HD&m5;>x;l^J5_#%zfbu?z3 zK&#p07Hap2xCgCS();iyqDjkYph0BIEhijZfuv5y;;@ioSw)zbg#o&AztjROS$t8b z95Ptax-H`z*qr*Qcrd)4koi=tr!v+@KvL6wcj<7eYd_bL8VX8|opj~F+5_PPS231GN%+d>OXAw>L3}kiTlvAog&gU?#BtElg$LEr? zpc1h#i##BLGVsE~d;^I$58#x@EHVy=NAbc32V|u`4q#IjGsi1~bLV2)+R`iF%20a6 z7Ha>6$nA$Dbu8+613KyC$Qdf`crfAqKPQ`Gaz_+YX8*2^I-S=w{H_gIJjrlzm9F4SAQY zKLqDWDUCTKa(%tSV9`s5M31_bk`MtU!8aPwTPk^>3pxhCM<_HV9n3NHun066rbh(8 z>;p1{I0C^VlJCHTfg_<9n~XX*I7C`Kh7u3Hi&!4-E!Dzhf}9rqYAQFy7^~_?XDZm2v*8 zU)rfEKRSS1ytvFq(i~-f1@=3XF8@l5NdNSQBtXR{z%eHPl4&;wM}GHwB~rc9l6+S& z5{fcw4xPszgNnspi%ZfiT4cO{cBP?@seYaw{94RFPue#kD}Pn!ytPCZE@wRV0q#?m z@$V77IQ~gje1lE?qjbwRqG{6NgrFOW0`3T4#aG|8kCvj?{q8>c@EdVS{q+GTCvI(B z0K5MHX`s>x| z&Sjk8TW5WPT!GyYj8rW~a*Oo)x1w&s!h}GKtyafS$#HSJd#s1{92d9pXPa-uO}Hs% z{HhCT-P}scH9EFH1}y;19GU~tfu?*spEi95&(kBDIr4rm z9r;e=ryN$`1Xbk4Jft@}ypJ-zm$4K*z83|352j@4d#BHj)VKaV4+n2h9STR#l^wv~ z^`Flz=bti-ihXktFTC>e%Yk$7C;sErHhQvr>V0kr*}%0AXxsN9x9qjY5L?gCxwYqA zJPo_hzKn~~x7y#}w$+#Y4Dsu%g3|=Z&%jmq8&{dm+lY=vP37r zv0|{kI12=J#Sl`*vC){w?G3DjumC>!yAjoFL3DKeK ztFiHV`PK;i{j;o#4QAp%j0g{q*QEgb%u)}spJ*diAHR>boJ3j=dorh-k+AFk+6T@l>XjXh zVD*nLK9k9kKQ$@}smRxZXEJW{FV6i>wsSXx>`lBe+R#;Vd7-;o+N~;t> zYlK)5V7@#;w{F+7M<|EH3xOvx!WVGs&+$Ozkhv~rACco__Xu-h#0Rd3ig3$oI(aSt zlfLzbd7yeQ2tbFG3q&4}C1uW{(={s1JX!s<)ip}qtx-~0qh!jD)!SL2O3EA%?Wj@d zaE+34HA?J}A=t0V$bipKi9N7zi9N8gaFIQ-aEU##aEU##aEU##aEUcCNB8!?!gcI{ z#RNkz^2h?NQzW%2uay?IJKZ^#QMV0eN|5>zbu@^J1xOW*=)F%EV z>0l#&+d6rzjCwZpAO67d}q^BJvw=LCRJsDL}q586lhB@Erb9D*&e( zItqr)OWK#dA{IU?ixcfC)lBLNLljF#;KgxT_%EnP!zd~4_G~)XxmOGw>Tz>C&LYhI z6`{x@sLQW-yoE;niewWjpFs$9ZIp_)^quYQK8gUw# zxIU&0r$ytA`!Qrp7Bmk2reck8z!{#Ji7V!@-wpxf47z-bijqh41t0B;5~SCanV%5d z9;}0t=>ABEMiy1-F_6jD1_%M}{xf0%j!pc2Ms&qc^s~@KMo{Tl(KBa60>T3h6_Sl8ju^qASLL>0HN1;k>BXa1beqw+RiqDWTBi&FUxX3IfUk)7a6fk&_E!v zfNef6>Y@K*=S5-U2(U9R1%{hxWvq?skA4%!Oq01`5LyNl_Y2;bU9K9FvfHJvc{*NC z;@7;|0nql8Di3$O=h9`H>LCj-v~Run(QcT^>di8K^$;|;d~F+&lC!wikK-r1pYRA; zfINW=b3xO7tz}i%_9!l}Q59IxP6$R;%F8$#xUOfTW zyH25J5d@6>^uky@MgQpWIDOXZ@wPUZ4KQ>Yi}N#W2&UjFD%F^+G_!yWsnVP?ble}1 zR!D#ofrSVu@8QHy@J7KE$OhBg1JM`*ClkdW?SE1Y1fFVnBRnoQ%p{lo{R`0m3c4uZ zV8h8Sf!4_-P&Dk4>6u&rBCrdf9^N7+e-Uu}5oQ2_TqPBB>8r*gpCykq)QBp<$W<#m zy%?ZUT0;}h6v{JREoGN=N@bhd%x;XC54{(niNEk3h$8e}h+O{sz51Y*(0d_5;^eVd z1l7(%^LZBuBM8WThv^GdE&BSC_ds4X-jme#C+~swYP=_D^WVRxflBT7}Qg`T8bk zgW6>HIN9DEgd$}@4^Rbv3l;QMmQJkxGkAY6K2STv7#3uzbO=mF<#B;nmboeX4cU&7 zONYP3hu1mfM4Razq)?{bm8C)I7i}g&77UFx{jUD>Xtdb_zxJwMr=rcC_|-N>KIC^UZORz<}ySwY)fg+Sp+z-!b5T9PLv!O*blp6J~I}J zX}HgS>7vug06xLk;K$ZIQ!hhHX` zkWv%ZC&X*zv?ShYXPeJVqdRIP`1r~Y3D?05sd~J2JF{QN1WQ)w?QtPiQi9p4Y|%-a zN028PBD9rJK~9wbE#jv~S;K{U2`M;{AyYnL5fcFeD*%5;ENTG-Y|{b{`rFTOXVRjb zvj$3KEF40CS{49H7o_T$HUMD|*i?(}PH!fd&Ao&5brp0j!E6Y(X}wzJVR!jHnv`hz zGp$8pOA4D}wS}Z7nsuVL?a$S7v{iIVqM2{MbKOPX!PON5d~V)}b;}D~tYQ0Owe=|& zHb=3p19`S`-{I#f2!{QsmLh-tKMt=^D)}yv@e%`1ev6zq~EQD*`To z^PgwvN!rUu2%XGq$H%a;j@*C zlgym7S#swW6-Ou?SQ7j!+LvV3cYmKp=aS53%{eg6AH{h?kU9@)9lk(6^!a`G;^Qw2 zp*9IDfX|ga>_V#CQCHrcOXY85`{Lx|au@F*zFymG3MJ~N+U6x#fDMw(d+@O^*=!6| z_?=`ktM;}t9(!>`@qt22>#xaXd$=WAq?jFGl-!YGrt!Ms>>TXs!U55AGouIs2v<*G zP*NiY*T?)qSCEWb&AQ});g(XbAZu1RYJ2f)x5spGUQu_zYl8w zd#2osRA#X`#+!{AT1J04IwxJeEX@Hm-ifrJzBf%my*AC%GoB9wp-1q2MfgDG{!ju8 zM~)GUqE2LA#D(HU&vf&WNcMjt@AHE=aGU$L9x=2k-HZp2uck}x=FTwNU8R7Mnf5g3 zz&HvNAzery3Ro@Do#|&Jv~nYD5VPi#kaJVR3Y7V0P!fYpK6a0}p_xCHfz@}EHfETY zu@|3S|Uq7 zuIvp)G6SOBnPv(*b&qD6*OfgDT=NQprp8+axRneSV@TnTc7Knx6@HoA->uC?WHpOn zW?$9d1*mLXUHC1Gh5N6PF$TT4ThW^XyJuTzW8|UZe`c9&L1Ts4W;0A*Nw#U=V@0+( z*fnBam{3#DOO{f2{W#JOo!{3 z={d&_O8cE9Wu$&0{KKt%8%xQ#X6Ld>RTyNe9W(y3`pKDF5L;^hfPto;vwwil_3}fq zUEb6HDJ4Y!5U6}Wa2)1N`MmG|Nzgk;SQU_19cT!`99#l$$~mL=bIlv;pN-}j#-k3w zNHn6ji3TeV`^9kdVJ>+7f1>O1%v>yUeS2*`t?qfb7s9gHQ!&Z3I?qJMyc#1wIo2Ad zxAV-bI7`Xqy9ysSdSn9Wxa%bt=T_eR2yMjd^bwo{pqJllTxR?D%R(y#8m&S<0(8^{ z0J@NlW_Y%ML@e8QJ|PIsB6S@-2M+$wFRs}E+>Zqxr?$6+NK2&yH9>)#K98EdwqC{y z-of2OOv-KKQ+*y!twb3f!ItJnEu}aLJ)-6Tv!S1H#T-w4O5Ayw{YFY23?A}8z#QtA z0)ST^uH5AM1+Cmo;yDx;ucDhJJR^P2P}35xx**CECikL^kIFel$EPGiLmS3~hDh|`iC!?{C)^UdznU&N&W>c!Xc z&Bhsw9PK3>s{s$-KWfy_qg(}MXPiva3(Q-5j9iH*)~^c8>j8Q~U2_~hrqwkA-5FNs z$$mM$pbB|Raz|i$q9cRP(vX7#i+R7mZ_ET*6JEESK!9Bj4C4bw?_vXn@}o)Wq|Q8y@#julkUJ!|2Ed zH)Ye6*`@|IvAn)nk2Q@w_06U!BY2xH;9<2hO7{q;qIiD1j3lZZ_qVmwGsyNVXjVEnLOiSZcVO38{uhN#$Gm67UjT z+R*IUt71ADmfN#Y?62puvq33lfYZ!8JX1ePX^=@pYQbJ=hr3i7I+TCcP>RztC`nd8a%bfsE z7lwrAR=%0$T@mTR?r~E@nXYLJeSH|6(nn-daR)Op4nQ#H@Mt5*)kLZo_cbxE&tw%t zj?NR>-enYFbSIjanaJZ6RcKyvm2&)pZUY{_m)V}%HW{({ASFFgDfR)eP};#zC9ygs zH*-qXRoqwbQ%G={T4-i?KmfF&(5zR49Z9epJd>20rOpG60oDpJKmaueR=lb)=< z+R?>5zgy{r-`b?p54}u{UhOp?9;jcLIsczy6C1-hCiq$Wl)eS()w z$7^hfZEk7yXl+YVv=8|MMgZB?0Hh9mC!|m=ObAASe5D??OzND2sof=JPUl~0VXvFx zLZl9fywO!oueO0!_JT{ydIR=vLdNV&sk zbtV-Ze=!scJ2y9(2ujOuS31F%~onTjY2=hw=uiRMfz?V zvwlzZttkCLo`Vi)fUL<~1QZut$mTY{bvMy{>9q1S{z)X67d$XN1V_XzC7f7ed z#%45i=qLAH^bU~TBWOVfvrP)GNO_YXrU;{f|6qx{t|iw8 zhznE%12~Ak@Y%GAfI`jG8G{d&$XGybOW(#liV}Nzg?l*bY|&tq7;lEc>~uWCWQs{JXVr8`kM&wyPO_VrlTKxN-W4 zuiu&I()wkw^y1my1#>1+&6#|zjhlU``B>J)-=Y_~nML%;rDoGQp*FdB1zWfW3U)L5 zhJc|l-OPPy7jBh?cQ=Fa&cQIO zsAE+|E~~jz&rtK*%nZnXaidk*^s9Et=jGR??j2Sbz^0rY_l1A3TqUG7aWyiHh_a?lyQW}1Z{u@k1*0v-D= zGuz$PS!9q$bUj-Xn7fc7oa zx)&Dp6V$(t**Wi%^HHGK!K{3F^xt2}Wab2-(a)aY@-?*h8Z)^zlPUmJCj|ZvI&RJd`f~!FN>WhK@>u>P6ZlT<3 z%mVk?6uQ2T+3BwgIo-?Lh{-!%912gte-@n9OlWVfqb@XFDtkEHqc%6BBgR{{p zqn6y4;y*Fkmr&T{as|PG9masC`DW77*O{%o?3SWaU)<)O-Cz2n68f7m!CvqFQmJ^n zzuBOUeJ2Ts8Zx5;tKM)Ou#w9Svk&{5Q*rCv;OosXt}p4>^=3i+$T(l5#)uf*vHh2E0%5E900Cph%+$IiesmLK$+0 z3x71+hP+EJv(S~n6~}=#`tjdX9GEiLwElq@6h3=`AO&s+GgYe1 z*s-Jt@rW8jv)nJsx&3mPZ;Y-J3GMK#r2l%bv^snCfVCA0GnHX9YQ$?F0=dIN~W zP~-@pm8Tjhb4uZD1_-$ChSy&dtlfVMHtU!1g*Pfh8IOTbUIXlM+8JZTy+L2$3t{-o z52yk6rLcy1LWQ#_bu;8=W5d>R9k44agT)^En%y!ut)UwpXX)N5jKKZWceaawcZd8p znNjt5TN{;mZ+3AezZ$`k4PhG|j>CW#86p%nQP34PnH)mHZai9alT-&zowzXzF&D}< zwc;(Xg@jyh%wZxxNj}&`oUod`4rp1&9_wjVPgsVzyMTDG%>sucA1va4N>xp5V7>e# zj(oBL8gg3WIbWR-G8uwc@vUh6kYILXXfD&q|8=RCM&Ara)i8SPW^-unka*=Vad*L@ zv@A{YR`V>NZZXun z3Nbxy>5#|_xY>!qIsX!sYNdNjGfJ*_A=4@v z4q90r!f<%b6aau(pBN9C)pRy4hAr=7#`>%60o&>RoC`+}P}9<%qzxVoG@Q^7i!!+` z7OV0tD%#N0CaX*^5^k((+LaQG5$S-~K#9eqViV#HRV^$Xe+7#eptg&kwNJ(~s6-U# z5iEAtT>~LLLEadsrX_JbhJejXUg?)gxs~jX+46yE$7*v>C1POkHc$M5CXTF0i4(!6 zzxj(aQxyhzP#WXMGqJvd)acsYECdPhC?$9hnBye7m6JQ_p=En%yiyYczn(1}q&CD( zj;@}GGsi)OindTnEhBX&tMbZXw8b}*0&70rp zY1}Xvro4n^JhO;eVYJIb{mc+d_$d(wwKNz=bbKrE;v^-(Zp&1=65L`v3-%mpu&m)~ zkH*4GGeaq~I5S}}4WdUI+$e+iF5dUPx(KTu%*4%K!~o_TVd2l<)b?gBbwc^P z0OwQ*KfeDC$4mF%$HAGQfS4!Zw3(-ET^LBG47{MScw4yF>#O)lK{ZYI%ED2L3Cr#Qd-{JCut^6M}28^}2cc;4aCcoDs|n>m}$F z%!8=P;>?LB%Msk{^QHnnSnz9EGKip+rtsI{N#xY&32-s5jU}^*tW$+u#C(A42s1oy zWmKXIz$5F|v7l~p_JVuhT)g7^op=tv+yIbho)U}4jR4MoDa_Z%e1y5|V&SWIu1F?1 zZS}`(gm5hc6mifmVIG-z&@v1}pt1qW-zjp)Y!O? zNn^>i4@(a)Luh12pM#a@CR9mxoludIJ9P|w!zD`s`gqKW6D3gMq#$KH5|pcl7MtMn zjLMwDizzo%mP6^;2#fA1b0|E%IGj!4tm5$ancR;8m`$AwEHJ>kEgV;*DVqPGUcm^P zk1jZcvxm#VJ92dfd*gYi5__=V7u1HCU}40^l&dpPjstQHzj!%5=%-p?y*Uu7n6b{$ zDM}VK;myi_Ih0%vIB@v{>dxbNfOG2zXHT5*E#+a@G4qU~^ccj|7uQhc{ASWCaP}}c zj>m-r0=hf4hw_$WOhfc8tkQCB};k+@=7I*IjbH zGuM6OMKwuE%a*WllE?xbm>^3rS_52xD1lv$%O86q7WA?@qAr(usZ)+5%nHwPPkHeW zu9pbu8ryM%YFXHlm(~7sEiCjEEM@zc@rqiHf?2PqQ!;<@M<0~zf5RdGV~^M4sC&z* zqBiHsRJr`iTO0pa;ioL8d=3w*6c@bc2AK1s3J&GNl~J(lh1`sa`zouKQ3xI9q2qg^ z5dzr~#r0L*JOQIJ#cC$LzBd|{wm5&|X_t^S3fFE$Xf99lH$!;{MdE5NPXqVN#!_Ix zMLHTTEU+Y7(P;YoG0KAPRQN7((Y7+R;PvTFHWn zaY2vjy*vek{oTjW%4KvC!-T2Btsv-v5LQ6iLMvA(&&2m{$Rkp(QR-)>#N0KKJBxvd($~v7+)MF{-R_f3``LK7h(7vMb_n*ESM!0np%)66iWs0 zZW179yyi_5Q`#f7Ac7TS;#4|kD*GW*O--Yf!<$RkkAWxTpqLP{k-u)1npEe+?;y}z zB2eY{-06PG3jXs1{d}AMJV`%Si44E5U@vE>bFJC?*Rf0E)mT<{By^K`ht}E1nJxI#3RW~;tsFCkcq3_B;O=>%x=NopHw)~F4l z{|hI~6stQ0(wPr9r_O9M?17vlN;$nlX(_6TrN5;zbO z4+{b+X)yz5b!AvKAgTWhkPp6#W~dn{*&!t5Ni@ZsW9cP&vFwo(7HV_$OdReaZ;hF1 z9eGL|o1S-Xq&sW6`V?KdTJx@&#B4KQQt>le)Uj(Mt2?EuolTsncCk;zBdCP>Z)d_5 zdnogtrB;o28~QSAnbY|`83clAThCHmRDIuBYLfj*C?qHZ#>`Ty+ekEI>u0I$A2dZi z(kLtl0rw$02(HdWT{XGBnJy)HrBD*Bb?OihggUqwMM9)0$C*+j>oi+UieDhS_t0AJ zEdFhAE?{G4t53E%0Q%u7B5_}xL`2#M*5qnIq5yD6gwtV-3AlI!-A}e=C`48>>Mc!T z8STUTn99^C-HEo)b0~a>u1w8<_=QcsSs0sgq9vq~J_mHfaRoA>Ul<%Th;j)c(iQKWKSpaoouq$`@OV8IaD zK4z=usILYt;5TDryvAGqO{hG2vfgj1Q>8QP$2ZlO5J-4_Ty+lN=@<)tORa2Q^a54EN7t|#aQ!A#)6}%TD6cgA3 zC>M5;WiphAScIH~Y}`DxT9`O)km$8j_iab>#x5CSAn8YO{Oh<7UGaR2U299VSc&YhYr`&+HU=1Jy5b8A;7Ou6 z3)E(*q;i#o9?fiputO(d*#B{k_VWU)v>scbRtwe8%DjLSm-%4BhJ0udM64!$r+ z6c44_zr9JOLqA*plyCJh7bg4E*d zmiPjph?`x3Nc-ie$w>!(MNhbQB_$s}`3?`%1I@sRT5M5{S|#&DagG8{4&^FDc7R5v zc{oM`(qW|nrf|MEZ=pBuwc@(5sjP0G-lUNGA+T--r7; zzzbKcQm1(uCM{X-NY01c?G|I*lJoy?KeJT*mjCF!0_zlF*fY6mL;9}FRU6RvRIXZ| zz7Z?2<-+&gm1+%q-NRQx$4?O(-c|?u{eq6{O~sCS3f zCuI!?6wQC=8Yu1@>|3MW8S5!6m}Sh;7(+soTJ(Fchp{HTog}0+_iTgx^0-x8s(|~k_-M| zq3du#=7jj#3jbJRV?`?=tqolVrZJl3uY-Aj$d$nAu2%!itY)C_4|kvSs%Dk;yH~#p zTPFL9V51Tor+)XKUoxxgR-7uEo&zdXV^b z4%gB{&X2Q$$CA`2IcG6fkk*B=?26H9uwS=e91G4d*H$%!zRFfLCZXUQFj_~l5QhU; zigh?vGHHZ@^kG}k>+B2e*<00UsmjLFt8D{uv0m6mi@9rJu6>3 z%f8sDR*o1C=x6~E>5?+@9Mkux>8$xK^|4B`WO%y9oQ4kL8tPF_7oh`AGd3YOo}$_A zU23F4)nH~Eq+UX)uUtT5RM{FEUYmi|)+}TRj&)#bORw~bsCFUICL*Kr)jo30Ire~`wx^)=j zS^=T5`W&0OTdmN}tQXY*Qt%#vO)iGGT}UJai=mAa;FD^DT5cDDd&l&fUEZyBmGjRM z@}{*HNjS6iW`psT`MX0%KrpVKQ9~YNwhMux(VJ`!h9M&~7c}^+(q7s;oo7Aw3d$O{ zS55JuC~#7AO&*?x^`BEz{$4ePDDT8xh_C_-KSCr=&%VII_o?H;3a(Bdd*?J8-ak{0 zUu7%y5gDFiNA{`lVTIc#7AKzB&Mxm$walV1Q;H)mi-60ba{<6MklHRnF`{yA2CnRb zIXrK{Wl=F$2SkucNa(33ku`RTrv%ZT8CwY0L_IY6aB4&6{cPuZYD9g{L~`+|WK%xE zm{C?w_;{)Cr{~=Aei)(4MHg6|_tgsWl?$vReXm_$L*G}U<41kBhSrhYzR;^0n{SxdTv$<$cHQ zKd26p_kG9m52~+ZZshe7$!`|FK#kkQFU<0M@hb`UK%5r8!W~M1_~nFF zO#H(3>V)_e3az^M6#@rJ;#V-%U-7F8G`APU&mg>qEq;OYE{k8Vow+K0!SzMf_k;?P z_s57|SS81cUwjFhc^VViPnrBZ3p=cKkk5R_dLM?>&@A^`ht-#@EwYKrU=*#&JO1rM zVnJ?;{Rx#nzX-u>wm0zuGx1%Xc$^aFon@UrgfeFFSvG{exo6oVeD7N8EwswsK7{;7 zEU{}~1Xo@_p^Zr7dQoIe&)>{ z%N(Dp#kJP{92PTXd+rXOs}cSn#lD3=l$)JVXGw4wmvevHM3(aL6M;B!&HDzz6U+;D z8-t>7@Ohsf3mf^Ue>*z+;kW;=F@|x8Qy5agyuh?tfq+zeNh5%7X=&@6drh2n;JjfS zOqJjxR6V1ngfI0*Z~D;AqhC6sCbODn)kDNwd;g>+W_mcUwFBxoF4!<J3Jp7pF@$zG^TFhjyRnVJ<1LM>{_wrxXaEsP})htrGvE=jWfuO9S zam3b@Yd^7{&O;TI|07#>Np00sRCI+WV$D2d8H`CcMuc6~fmm($IR}`%mCNTqAC`dZ zA{NpW^s(TAn(ml)O;kMxgnR6QTHTqA;#>@ZUS+nyD1Z1~U5(FM7u796 zTX5I``513HvY$S-b!vn~@y}oyrWTOr$mtY>a)%QfpKj@yXN(TV4%(K9<75}|vlTz8 zL#??qZ)4nm+N9%yRxocdzT} zA=LT>nS(_rd5-(|3zhLun>POPR>2Ss`_h{D3VuzFRuV!UID(Spd#DhueneQwlOtWo6q#B zw>2YN!S6>lvqIG;lfekH+qIT*_HnU&!k2HK@a5Yld};f{w%N5{(O?(K%lAz?qqVAX z_A#^IF|*(?v*0maFl76U`z{pmDSy-~f7C30)GU8gl;2!N`J=w&51Zu=o8=FiS@3{a@BkHTXkr(S7anzJt>pd+>wB_m6iW-%5|Gp~SgR2BK^8Y` zOU3)yqvC`8S@__dxE&I#MODO-1pNULaM@4@Sp0saZvpmhuvQzkOlN{Mx;51e%ehiIKs_eZ70G_$6=>~t~OC6qzXH+{Z58dut(?>WS(g=+Qu zvPQ)_zhb>ZwRv){G&b_Jd!kr)nAYd+o(WJ_hH*R0Fj5iNT*0_63MH=#N3rCN0aA6!)N0s~olIDsI?0p=#VeEgo<{ zA3IWFQ=D2t1W$pQU!)+~!ls|?n&cM%U@NgpcCCh-eZY4x-ZKZ|J##SLGY8{6K?SQz zQ$Y>(WrS8=&VG-DM{3>W>^)}rJ!bhmX8Ap$d~TWL(}NK|9MeF?GPuXAX_r|O?hBG0 zA$ylu(=I_zDbXH!;vl56%xK6>$R*&|ZkFC|mfmib-Y!b_jPaDlG}`WqfGuW0JoCnz z-C`EpB04bdh7LgS@qLU&R^`rEjhtV!jn$fwxP-f6wdwm#tQMXS{A@Dug9k7rgK3F2djsF0CP(UI9Q9tQLz;!CJ9);LFzzeEHgeFJC(< zq!qW%p)YvbEV$Y%xY{hZ+AO%5)vH*%YKbzrW|_CmGH;t@-Zsm;EgG9xsdQt@&4RgR z!CbRou30cw6wI&eEf|fb)Jcxa${eO-N%wJM0msC0(DQN?t-3&ui|wz1F$a#msiHM> z*Qg3oi#RYTSBO6_rzG*G@GbUuy4Ema<4H3fm#iqhU=kZvPfK+lPS*;h%zUH@-8R5D z^8?SC#-;f4BH)qq5lW>qgCpZsash|uDG&kAjsYQ_XWm?&JUJp@=E*~d=ehXpD%6vS zr%Pz-QN%-#qlKh@c9qC0Z(Sws5(Lcja@TAIBaY{&%Q-(Z91`5SETJb#A`p6PF}!SnnLHh7+!VgpA|qzd!J z279HBb{NyYU0v`4Gh^Llh+%}yIa231ULUXmuJ~Y=0)hV*7RXzz6U}4qIxmKJgdb`ZiTclq@z6{0v?U4%r&lg z)3W(qh&#H#W(ao6+kMKM5rL9r3Q-Z)u99;MUZ$wPr_5y$K$$*VwJRDbLQN$LWzC;a z4BQwIDA`cfF`qIDmU!jz0$zq@0ZiH!u#9`O9`gAG?)mp<_Y*#f?$yr7In!92j=?RQ z&6?_3O?TRT+VfK8bQ=*`28Y*!7i$@KvHlHSc$rdo5oOB93(E9^nVuIh9513!`FPZOUr*SX>6w6QttD>3J~M zQNewwJ3o~mZgcYhd=%D4(>9et{d);JQgIy|y`^eV z6Yh!^{LbKc*tvzp8k#F%E1teCnO;QccBFSMI~@mj@Wg`jNrqM-VLPuMEXP}a4yF4$ zx48Ej+E`j7+IQ3zN&#lGn^{pO%@travYEwoM#!vkGt20#rKFe@Z03+*S*Dt~VsB?E z)UAQ6@P4g^du3-WORBt!Vt};bJlmqUO4c`qb$CGQ3SI03HvMo$e5T^j-f?DMhV~A+ zHq1eBe8TgTp}nI#9_<~^Q&M|po|Iq}<$64;SC1#V*!x*plDkJ2h;qKFo}vfAHlVl* z-={SRxpO8#iC0TNA+y}JhqOUbrbkcXSB9R(kIyKsrx6Upsw|R3 zzB1K6wBA6~<54)_>;^%v9tQzv4{5F7dK_r*VLIUcshjq>*{B!Qz9l>dS193wY;kNAQ}WzOG?6vdJ+g=P zlvK4?d&+fCTrG;4iQ8Ghj?r`U6eAPX3(LvY6{C7-q&yql8*8ZMK{~;OjggOX4Cjv} zkWSTsic<-fxQXRax>0}@U8q<8-B+tCZFARrRC`h`$r@sAU=28w#|G?|$F+(7e__1Q zliGw^$N0BTX)S_$ra_H<8drAa_0y`br~7H~RejXcw33xQcG*`LN(`5Fu!{Y$Rocqh z_SaIS?W|vatq3dD!vnNrchErXF}YHS;k5b=CoCn*;bhYXYtg=1Q!dVx)S9BGId?c= zSc~Tl*$#-Bd~~3g6jsHf0yRtcs6f3XOw~I`oK+s8wNC-}lR5XpRcqWx0qf&j!773~ z-BX5WO<;yHk?nt4YbWPVVa{P%`>^bZbGT^;(Ouzn#`+D@D#|(8?kU4GU1I$o*Q%AI zKHPgOwJ?ztywAe4LuRS99!X@bO(AyHx<*BZJK!1YOzE`5H9|}Fo|gQB{PqSe>w8*~ zGg+(W{$Ye>ltFnmzWUuT*ZV%FwYZVE%F3L5#l7!2Z7#8dJ}+v=r2!rq`Wt<@;B0=x z5QxQi8G^}gI6d(^UQz-_!NF)TBW}l(t7>HO7-+08?&NgO)W`d9Wwz*LEz14%%UW9- z4M)AvS`vx*UM^kE`PDzU0=nPJ()N+0cCeBvQ>}Qu|YSkkPKK3*} zfEouc+s|sx(%Qrw{bmNquiNd|*}?1t+HvA^C%<9iXF*dv%l+Xj?LnN(yyvbmNBi6s zSF{z`<0(7Ni)b?9)e+u_xcS(@tl!3(&ey6&6roZQVbb8ii=5KrY-hvfYteGnZuj{4 zT3H;SqZqGU!>(pHrgDrbw3S`^ll_=G-bUTNlqcO>oJd<#U_yF@otbzDl+qUHi|rt zcR$4Q(58mhkca zWzN+gvg5g|!D_8eQ1&~bo&gTlI=GIDOIJ}4jq|bR79yxm$XFaop&b~@vPRn;1!KG zYkh3kU)k8{KkLQ$E->ZsJW`4N9nYgYo-G!y$1C>>Y9#{++?O#;)QSxx-1W9-drL69 zzqVp@Ai*bZ)9x;DK0a`pmK5h}(O^?XThV{;fC9YXxJ{c0%4oP9y7YFQW&Q8BR~QT0 zToJ4DE*>V|qlvv}r}nrMZ60H{!(=}7n&414$xg_J4j(N)ln*P0f^1<}*OtttP$~GU zOvH=y?0oQ7d~@@)Nr}ZAThG9`}?0W$E?K+yqMsC2oiCa`UX zw8!i@HV8;^1{)b!B|gwp(L%Dgcvy4Eg;!bV5iO|>-}?$C;+YQEMciPoDfS&%W7)$; zuvMSM8h)UyyUEmEf+qYfSy{CUW4L$c@;{$ix6)!zQxCaT7MPa4ffA^9IO(%^QIIS^?T`^|7{r z;*{gCe&gn9o9~>+pL)Z zchaX?YyXfEMCtB!N|Piu;3VHi%{9~yoeH>{R z@I-0yDXpb#ED+2dIR)dZo@cZe_mr=+#k4lnJ*{1)Z{=@bn1SzO-)hsPlC82C=d^Zc z;n%YoIfE~QQ;$EVg}A>vr!}CFt8hV^f{IpO&>oefQ|_?uwe@mx&TRM}h8_=xOXMh% z%mGsUpaLO>TEp0>AG9YNc|VLJwww>A8tx81YP01;Tz!D51eRU=O=bG!!m;fs_!elv zW?a&0%*Ma607?k{GSJ87WcwxUp>zU(n&%$JEXq<5#G4QR0t*~G9OKrjk~5p#^|Llj zzP!nOoPhxi#dMP>f_VuS1k!ERgYhBbhwed@~bvL&i{p- z|5dBy7=L+`Uk$5ev66L}xvpplj~(ztbfGsIFSB_f3(UwI4vzmKm)~LnCi$wSNMEwv zSG9~f9*24mRDx<)1L)p`0zWPE%&^tD5k9u?X9*v!AZ{Xb<*K$?&ij@v{at&Cz9D~T zI==26e`r5Ra^4xYeocEolJ|b;Ui7E7#VQwmLrfwzm{z9X=akmN6f=g+mh=oHyH7|k zDyMvWGXEv(LEb>BRgd%r46APU23(^tiHBMBdSz0Wd@hzpO6hn|G>1lesq@`f_qu7QSm1h=GpY108cIS#!-~?9@}fvJEL9he!8}wPVUrO z`{_^P&5Arfy(=Bi+x_*{_i}4gTWTPTQE@K~YJ3SZK2V_(Y*MVip>YseCo3Chjk2=j zVRZII(26T*Ht_NDAF+x4dWzi~C6?!}x5ov^Km7G3)$%5r*X+BXJDWX$o(SZ70*@nb zU^44&*R$__L!vvW*mA-TEqu|E!VL3@9MwuN{RtbOI0q}X5d&OKOn=*mG`q7~Dml^1 zjvwF(q{mqT@yKVb0R29>=#=}p03F-GqLc2KL3(W*w4HSCbLjnSmE61NahdrN2%B%H zZ1)0yT5ZV;&jGr^2;c?CPENfJj^)EAv~#f>Cq2L5Ugp$a1qtkCl_K;?NP9YRa0=@e zp+ASTuOf7-1J*`Q*U;nHYt{8|7E(bk6cHWVEmHK^R!{21G<|Qt;nY;(tA|+cx_VQj z6jjtW;B&E_-pKt~C4G{gCpYT4g!)l$5MU7XqlO3Bg*y6>vZ|TNs?^i(Le@v?=@U>A zRkoK9Y}`QanV$0%3>$00L^X~4cqj=P_LCTICGWI|$NgD^3Qn`F4Rj;4$c%LWQ#oI| zqZ{h2B>BWT_k)e}DEh$$HrD6dm;bdWt3;6b)hRRNt=_D>mIW;-*QH^eCPblB2gwDv zWd1c%o9JVLv%V4WaN3y5K5wEoi}HYsZ7*$43ljz)rD{{XV#&N+n_^6Qu$PT4sP||yy{@#9U2mo*$e1gM&2_R!d$hT( zXn2y6oF#JGMlutpa}9ihJz&#pB)~IJ9e4tPDxT~^v=4LOUHGxN-kivDSjc_x?C!ht z^d@lDWD(AoXjR;rMK_uiOfJ*G5;+z_r|^oncRqswxNYpmeGeuWJrk5sUxnh0KX|~} z!(Hfv+rS4yRrDejdAD@BBF$o|g#)ByEB$(7-fM)~k;0Qa3TXAc}*>j{~J zUnJ-Ln_IR!zvu8Q%^@Eu9tSJATkwpOg36%7?W;@~Mb1~S((_PJVI)EUX6VC9kxDp$ z$J2KI5v4>ZE;F=mN|X`b5<75pNSq7EsTQa z7h^mU*hn#4rvbP(m3VDG4ipX1lIbp9Lr86w)1D-x7I77Y*>aK9kd80(-uc8xeBbE zp{GjEvQ8O#ob7cS%9ampg#$iz#1_XR+@7Co4N0oR$`P*Uk#}(qU$`!dsfgR9sgj&Q zKj^I}IB_Cw#nW1ne9!1F(1pYdED_HCIvgwMR5^yvX>zKcDJlm}3wdJF!?7X6< zN#mKLjqa)sZ?YcW3j>tetrXcUAaH&}`BHPni0-S8gdf^&Q_lI7lkMGUG% z9vGG0t*2%7AP?{87CO}f3Nugwn9>~ZBD$|^QZmA18WuuJDw-nedEM~ z^8i;l2AN{I5bErc8XBeYg9J&^z=b+#9E>?frys3i-=op&F5`d^i3eFJ|UUgJ~vU7x~R&ELr=T$va4pd>^> z+0gcSQlso;#SPCfe^bK?&EF~bU3CDwSQAIUbcWX!=UCRey+zWcWN8QX7?H# zhUW$J?m?T1v2d@dSGSv3V9%*~HRme0F{T>u@E0ykITOt0MD#mS7OvT$%h;tlsO zUKb7WM|mK$V}X;Mcuxe2Apg(#B)BOU0-THB5Byx73&d?eRe!L;`2F-qCyfL5#eSbH6BWc7dX3sxp~O;V!%jw~OAixds47S_^n-(WVyjSMAdSNB zu%`_!6}k<5Xi#xK@n(=7B@6n#oxY9fpjY({(E1K~df10}b&3y==mNXYL9gq5BBX9d zy#`j+o*nhp8T*95oED4~FIccZpx1-fK*R=?VvN3VQ}(bgI_iysF8mcCI^B;YcG450 z@d79)93w_+g>rCdC`_=1Fs+l`)BfcIs}h31+D`fdL3})Dh#zH+&U#w#Q6z@atEpHE z*|yGl71q16UeVjN37xSz?AYv39H`*k&iY;PDepF%Res zrN^1}fc^$PrykG~utod*0qkKO$7`2*Cwzu>(OclNx{Dr#xvPGk^!V(D zI2ef!ffycV_dTR*Q4f&aMrJ z=dtcO?sA=Ele_CF2(Ip~S4qo0iFQDn7#IumL+p6|G^=6nOqkCdl9%A`DL9E}BFEz0) zB=^#5-N8Ja*h_EVCFXs-^qS6sRBX(%fDeKa!TCNA=Wnjvfom)&Sqx%I7AZkL0Y1$glIG`YSZfA3mxlK0u|YjE&|pRvMhniCJ#? zVx^MYyE?qlpgSim0~EYW=sXG)7wAbENIEc5M`1eKAs6xnT0W+0(or_yF}+p-oPddE zqseEr)jNjwh{ezV(NuUGnwkD=SQhp%vslhRoz5w@57cY1_aD~{*I6$)`7Cb`C+>8V zhd<$i#+)bgR40wH7qFTD?AQ}}r_5`Y7n7?|xH{t7e8qAfbZf(vqT-+*f&tL{3Hxa8 zyBOvx+55hUQ~aEt;0_@)IsByzaBHwe*!w`FFMbn4Ry^-v;9&lb;8zfw&gRa2hJjkZ^)6;=o*0;YN)%4bT5KCGq3rD0WV7K)M0k^t&z#bFbr`d#! z$g22MI7>yh|8qbxZx;{PIV5Gw9 zwZ+j6Znl70bN=G^pioR*kOAH&hZ7+59!)OXhC8p$Lt%Vw;#Cj?!!vmpvk(Ifj|k-S z067;|CIyUhVz6VIgu06z3Fp0T`dbG2X2RJcAjheHz_XzP@q6x*OOJbb|>eb6)xOdekkZ^E}e&q=d$-rLzF|L(N zBX7Q_q3(cG{-V$JW9+LzdW+1lpCuv|gSZ)kf;8I7#F6uID;5*DOaz%=8%6%{O_eJ- z==+pZu1*XiK}5q3?z6oV&k@tMr%>QU9teCtz+G&!CE zpPUc{O6A{JUjDW2IOy>?j8K#UM%H(j9$n2BDBtSmeHV*e3C|AQDP;#Z(bdkC1I_5e zrL)(2{wB2_|GIQ`-r3{jRsRd12@=piA!|YdSM~w zKj!;bT&v;Ofoj|f&&&(uz_a3`()l^^%gg@#+0xlLHp|QY>$JEVp^2{cT{*y9!I@v6 z06x$M_~Yf}pLsm4to&oXFQ@+1hsvyfV|n>^eOhMyXUfaJ^OK;m;F)=`9C$v>iYrAt z9QoyCpEI&_c8>h=vX8nUJD(^&lmpC1Ka@$C$IHt<^T#stkNL5j`u{4s{*C43&s{B* zMfqpS%Rjd4!7VrcuOGt|wIDW=?eLjC^QUs)KeH+T`U^g@9D+FcV3n7B<>WZn5A*Ce z)S-#U2dlj72aw%QWXJBs%hig?0cOcx5oICgczOBR`ZDv6xl~U5Gp3Zub~cum|HKWw z<;Xl!Uj9Sp%Ve`Ne=Y}}3CLd(n;iM&Wq<3KwG=iv^2^J9`i6PPXUZ?-0JEg5i4|4- zczOA!l%0Rf<#Ou(tt@b&s&6bW|HZQNpD8c@mu1hynZK3;&%zsKI!Ata*(cnPog=@z z?7x%+O?0&@TRHW=d8*9(8_UZ-we0+7%F92x?EEvYmIKe# z8{jA8_bo5`nBSu5oLC6u*ywu>`6s+5DS~ZzjRd%y`#Uw8!*?EJBya-KBb9RQXUZ#j zawv(c%9yn|e##kgqcZ3f-FS5JwU*#zqyXSCge-}hG$sHV{m}iLZgg*w(|spUYzT$epPS&a1WQ2jxFg$PDs`;4dm6#eFxhzvl1|Uso{k4buy=TYcBf9~ zu~c4yKW*;(*~yl^rq}Twh&Y@&w66JNH2d*2yJp zA<5#1w7@Hxa9H^Dm;Su-jx+QG!?5FB6IjqlJ+7uXsK5erT69|CPZnFW@mPsXGTE8T zx(KJ~)Z5=!2b2h-cnkJ{JRXtHj?}+o_Yc(R24G1g+PWW)8 z!w9z!qh`UV{d<(&y!aI_82}IvwJabZZrTPTB|docS|;txD=F9LUPecZt5umk4O?pN z)t!>+;&L9MZHkY1BBDWncF+6a3T&esET)_EWj*kclJt+@%#WX(`6T8 z@Te^R!M+#`jeJjbWi)io-P{ev=pk|v&J+0Kv6X-@8%`GplBOI|jAzf+^=-%*H%^Cl z%5H4!cs)5|ndIU%S90Q4xabq!4MqUZQ9_~rkSm-XV#Pl@{zc#)bpnb)&l|k(c9g=Z zPXH+0*u4|{xx&@CEBAN=z} zFdy`@x|8(Eu|4U{GBSDyhF&c|F~_DS8#GC88iW@MT>jYo1HWr0>1(83?w*rjwHFQy znyq^=9Q-^9 zIt(bq@GB9&py0zMfA;qgU@raG);IKI`y_s33Sx^+woP=$&Cnl{ z($ITiQ0Oj(5H-Ql&gC#|RDd2b0GU4%I-Iraz)Zb;bTQ!(*6fPyIik8Mv-EpFbpvO? z{_Vsu_Ty|lj_sPI$Jh^=53Zb?rC0C*BF)xgJ7#TINWE}w!&?qSAN%ln7{Yi{)xv)} zFXGWw4iBK182~a?&ixVrt0@b};DDS)=0G^1q4=x-s9c_!t=A7fC=nsz+8NYAHmp3a zvbSgJZA_4A+h@=tAV3R2Q`JO^cvJ+Bec)M^_k)yu8#!3Y0r7RtVEq^@iVm{3m_Cpy zl3p;9f;o~u86`%k&Kw^kKQKpcV7q3M0@<*GQY70mN3WBz1IP9^FvO(dN$7mjmm%T^ z1N0;*UwWA!TC?&8jA0;)krtd%WZG9it0ldZN-QHTjq8OmhsbKis?0Z2X}RXhKOuax zc`BX?H4-U9vC`pTZFcZY{l4H{z%HUHrAf}7Ea@$rf_7tr-_o}`pmqh7B-t{Y1KIRB zdIH-ySMOo};X52L1D~#WFj$bBAEmN)=jxC9MyJb&ROji<{rW37?qN#ipvtUhz8(x) z=%E`rMzex>n6HD_rFr^e(aU8V@LE$nUU_MFVY}IXzMd+7oXRH8zm-}NS%(Gsz2#Sx zVzW3=+2IAS2)i1}{=Go2CV!GzzQLNjtTuaRA@q0M*nx$5^=df>#@VV_>CrRHmt0Q( zCIm{JCqPf1Za%;gbM!j5k^Pz5%YOLwvR7QBFOaj2uuJdhQJJ!mbr8!(Z3!#;2$z)~ z3?uGPskmX7UHOMgMN(Xu8PWR^HKt(+#k+8&VuwBRjLU{94zlix^>$UVK0rE%5~map zYw5kR{3G5H9=MLMPRsRJIqM)hy%?q#`Eb*@4BxCnEM$qEnB?0AuPn_z>=`VIsOtc` zXNjJgknhu5(VRbWP)Ati61`(){!tSO6NVcwQC3gT3RO|MgJ7?`<33Gt1S7j>vvh*X zPT+E27h!Px@oWzPHf^6C9r%nA|2(xV#*O7H)opUtQRdjMr?9n4^bi)iT#u}hRd53m zKl~dc#{0r8kY?rGfhSYoHrW>gA{pk3W(N+jQOop-a@JwCVwqkCZnOxAG3>`>dW$Og z$4Y~eMKOZXN{uH9(s;(^`%n&Vivx0q15zHGpoQJb^{Dt8;3WDYvSU9k*Z12m_N{sA{zD#1Z-){d6`COF5|MNa$tOUpBN|tl8l|eLX0)IeIs~B zoG;t3vsG*K_|{&wQH<9z*hYDHJ;d=E?+bvyqu?WlIJ%Q>L~}78In4U51s}o4;2X)_ zTuaa%B;>}h57z2$OUu|6VstdGZiAGMy`%36$p46}cd%QyxB(~c`5&=)yHHcr?RqHt zDNpwcrgT_?!O@Ph+w65P`|HM1^C7eLUWYqo-Q0uM>AfYi|H1m(Vgr>o{O3*Y-l)4J zVq7-%XD$vJPwcc*<W^j3ovNR7U zi(iPPx_D{|CPI>fFW2I+9)Syf%=h{VT*Z^VEP)GRVkFDhr`xm}xH+j$Zfpi(PnrA+ z{=tV0bMeH(B-6yn5Xx5WBcbdDjF|lOAUm^9@7S`mQ0B`@1gk3pgK7R^v0+cYr^h7T z&;*iAw#guC#U$Oph&hkv9W0Z5t`R(`?ya*Ucf|YpK#7GP)E_ASp7Rg2iYEnYdO)w> z&N`^S2R}ji?5!hUk@)U9qGv?pilABEQ*hQ6w- z>p~$*O3c9U5A=KGoIKX;13ittuY91l#@D^$1Kln~u8D`*$|d0ih9*`EsZX7&*}slr z=d?QBJ!Bn>0t1UIq&|TLl3g#*yMyk#AJZEIz&AXZRIg#PjzO!rhP{hVWH&tFqqyKA zo=PCOxusqC!cX1beQ-j$P0~&%7cI`7N>27TT&WpUGOoxS^pQSTO4& zD`1CmPIB&ua_41L>>=4u$ujoyalIR$)jq-AzMK2iPxPLW17*p)gvz?le5$`D1t7*w zK{nuoo|4whh3W62*VK6j{LukNa4}#Bj=NyhVI=uq_$$bXt>p(Nu(Msu!avvB#>A0@ z3Lra=wk1aovL}(8JgqZGD&sS*PrdaAN?bAThZd8Jr9_2ogPlH&v0b0T5~UkE_qkrj zuUmqWUBD8*&|5@h7mT$Hz&_T6_tBqIu0nU1UC8=AQZYI@J71)Xby?dq9lwI^(`V(gK9QB}OXj<}&G5#DO^ScS8CT$BfizW87gAf-O`JzJ`ez|PJ4cEVUuP2w?jhjrQabMs5Xq^7~pBxQ#L9bGFH*PW-SHHRaZoG2tpPDN) z8Uf$yNzq`+CX4c=s+$Z)pKqbGyiKb5XNTj3vv)8#;?Ldw9W4kCh#?vUz@r< zBHceBr%_*5{B#Fvjicy)Z92tWy4jG`_Q;N7fmN^EZz9}8_nlJooy@qDpY`;=7o-0> zGw!pWaj$V1bN-^QCHXx67rk!r1dR0AYusdmRQs}yH~7Q^EZ!=>TS}=-Po&RQVd`by zt%7gLKe8Qa@$27jhazv-Yx(s5PPRkqu9nxwe`Gr}|4LcY?xwxEqwUZgbn8Fa4*m7p z?RV==wnMkpEuwSB?{^^at^U0%iSPf_=rkx^u5r;gY;2nUf2M9o{`c(<(w&Iqw?0U< zWaIXCNmH-gemCw!EWh<`EU+4PuuHn~XIZl0&57-w9gfiJcQ9w(xqka|=ARpm|Mr}5 zNk$p!tD6tforn{+PHcBHXQs=y-;F!jJl%RXFlYX5^K{v2l%YoWe}(&773FRYUr#?{ z#BIxNq5g(<^Yq`9-Dsu!(BHUyjazlQ@wZ#0n_}X>xmCJ#s%sK(2Mf;Jfd940lN)%m zA^Xp^N;e%fb|<{;ogl+!tK_?l@D;KDJM*i*!+4?+o%rEwEoy)(hMs}8xMCX1eH?ew zQCJ)-hm`^x)3L_EMs4N_HlksMjo-TepMS>DvDo-vV^-y!xV8W%S#T97o?eiZl(sNg zb-|B4Rp6o{{hq8%h*3}4$wq`2W2I&8KSB&yLh#Q}V*)4a01TNG`;Hq@OHZoErI0E?21C^jI{=pfEOspkAhqq2ksDj2EE9%YdILUfdI zsuTpw7Xl_AU>VUyP;iOHwXBMbS?hQs!~+3i#SnCt{KXNY0HbznF&IpMfmR5N!?7HU z&ti=aN`W!Q7mPU^3|IJ#I7q${RT7LjCKwEe_zX~-q(j#E4UL9n9zx64E3n#)j97MX zTcQ_Ja|DQh03e1Y4Il&q`FKbUwiXK$jd7(webX1zH%*KUZBQCx6OxLD>rEdh*8<8D z1SN*-QO{_-DPTa=6^z>5adCjWF(~9j3X!bFjk-T#iJS+J#oQOBQt-^}*7{tDl-deL-Npn^+Sg_5Tw zI8exd4+Pj}V@f*TVk=UNdXWS|>4Z#|QIDNSG0OI}?kFstBJMRVqm3Mvy$CbJpC&l0 zD4pN1ztW5}J4FsaplU^*x&V&!yRlvsjgA#~=0N8+xUJyl@^`ob2f!E&FG@Oj z9`~V&Mje@^a%H23BpQH`mY7Os*g;G>vw<`0`(LAyi2nVA!Io%B7;G_2g1b{a#duR> z{yqR#x8N)v7C`~rB8ZK=67?AycwFxqXdb+~{Mq?xMu&0@F<4~Y^6jE}m9wG`YE@0Y*fsWobxP)?C(S(6WGtCpHv` zjmk`HBoZ4JC$gW+W`b*rW~<@bqC}0&M4{%zg?yT8E)wr5PGnhTP4ms~R(w-R)YwWC zYVA|#a&6=O1dJ)JrFC-21H|)AWTfO244_XPF$AaU_znS_CSeF*i2)MD@B?e%b&Y<6 zy_f3>>@Tltd{N)iIAP7g^OH3T+rAaa0nt}k=qQJ%HLmpRS#Feg|adYMzXER@x3WIW|z zTXO~5LZe_?SYL`78R_!UV=SSu(b~T5AY6mtl187##%4I_T{O9WWF&E zZuG;a`&~v~sgP~I%Xl!Im~fm+ZewX;ZK_D*pOO%Sn_R2H$&Ht!tUMpW(b}wq(F$Wp z{p<}!RKw~Nkn^6#iQl}ZF7cc9G+q4WJ*_K#^PUoBsCrrX;}oo{#C1JcIV%F}`xe+8 zVdUdl8nuHyIhJT%DP)~m8Z9uiQ(79e(2Z>^jWmRwZe^rO?%A!3D!zee_DCxuykyLZ z8)AxXh-uc^Nc10)1}A4So7&olkAZ8+#xe}a(&a8bSY;Dh8x=%aPj6cGUI*L+3}HLG zX??tDXU16JVPOcngfwXdb7mNw!`Fo1TCK~0OH}kH3Ab&BXMlFMFqUETmUg;-%P@LL zuw{F&jnTdG*SPrwt46DHO$b~$;jAxR9z=io(VxfZPao&k?&EEYHB#E>umr4;xYJ1a zFjB7A9Qww&Vse1&6YZ*J_^Siaa4 z1F%{b@W+%Ek1;WiZd+!r`0MGq@lz1aiL; z!wwp-D$~pWq;cWGA8|C{{6Ot=Q@Y4PmyNH~u~yBLUtt;d85M~*p199wWPkJXAXg+f zz@qz%C5{tObmcnEmEt_XI<_;Ol@__*YiDed@qI-zCRp+H?`VYk1#byYfLAzI1Z0gx z?uuQETw8OB0)j)Gi)?8D{LWiC`j4x9(e#oTUAB@(AXEZ56bt0|J#5?$4%qEs&|x?B z(!)lpIB;#$FB8w*?6PlOLO0xsnmTv53m!JUmnzc5M+uK5(69%z=T`^ui!Mac#az73 zLKm-l7?nzn1v!~QbJ0DGu4rdaPu|?ro<^$}S|t2jp)SA8u23|F>CYScx~K7lggcTu zA2AXhduonvsHnfw|C;1_N!f@@d=)}pW&(w@jpsFqmdpc~DN<@~1j;Sk*8jM>QR{fx$sd=h|bo#>W7 z&b!S2Tbw)+vKnru1Dt$%-Orz{{K7}eKpufnKpI8C!O=kENVByq&QcujPUvquD@&iS z?19)|e!`XyG+LuSX9pSs@wtDH@hUzAgN%pqsXo}~;_W~%Ixu0dQLQ>U0Olt;0K9V- zk7c8pog9oU-dI+@w?VEWhx9h;%a@&Oac?7o-kLSl=N=aw6w!NyItgd^j6DbR;ops1YwR zxV#xm_C^_Goi6g4Ui6_Xr-7h8az< z#_SsgtS)Ci4Fi{SvykCrR060A8YV}QLR_u z!RuDK?uum#Z!IDKbnyqgl=Gex_%nC;HC}5N>N2tYfn8a{{7>S?3pxNKYMHL`5BJ%!@|76f7fww2aV&b#NZ~kNkJw2?j74XOa8(i^h8Yqzl|J zZCf}iw&OgIeET`TvEVYrfhBrzmQfXp?x8Frow-Ne8n8tN1h7gO!2X=YcjD6rJQl-J zvW)~{DV;_d31A_e7Z_C?^B@TmwaOsD`G}9)YPw4l-V%Xd6IAohw0MCC%M+%Mye2W}|$(gdR?Z!gSK zj#dQRhU4YnbzvI&d7|-X>F&5kOoIGN?b$^++6dEsqCGp6J386uQo0;#GsU>>111#< zz-aq`iDK2*>r;)^LBBdV{t3@?=f5iEvdN{;CWr|$EiTQf1k(#n78jINHQUqUnKmy*n(^$iE3N4*l210 z;w#Q2XHPfMLm`4<;+qc^)nz|s8FjEal}AtP)oddO?2t%FdW`kmYjDn7dNodSO9#ngToAJxf5T1U=0r5&}ylw4)c6$)QV7 zsf2D`4&Y+RGr-?xvUW3|O9D(U&M=1AcLOG(!%H)aA8pb!RyfD#Mv2YeG!u!T^__1- zy5D=#_(VpIx$}&!l;f9q##8pgqDzz`BLb2^F=7iy+GVQ^wX$@Hox;eLkK@s{_o5u@ z*!0&QjARQI8lm(`1SD)2d85t(^>r6 z;#|*q=Lls2t>P>v$B3{W!X}Uqx+Mp?7T^#msbR4YZ}8fXGRssqJg^9A?>E_ti;Sj} zrvy=bxX8GVB0fvrOEPaez0FBKHNW2y0oeUDk^dwV+E z4=DjU{1=vqIn5ijdK>+D8TP&tnQOU#R$Fe|XD5J2xO;OsSlcvqWw|jCpOGt!Hu&sY z0VXhw`Q;k-;-lpnP1JGzwCICU02YB3=o|+REeHl9NDmsAK?uaONkKd$WAx8Vz=LGG z&j_+3xkfEQ>%VhNII!lk_A8-Zc%Q9WX^cjbb>23X;&c3MW2*S1vq`Ir=kQxz%~Mva z<|+78Wxdvje(_%0yuJQ(4MY+^RXj`hgCb*CyR}Azg#J)d@D&y!+mpmWE#$}-FBTnR zS!<2DDf1*a`7i}e?(rBwa%yH#$Ysrw?8CK2wRAj*NU<_sso?~K_j;W%7O173po#Y=pCbW`0M0Q7}4N5X7sFgjEc2E3!W}m zQ7J^$kNsu&l>kzm*9D4ApC_qkjG%uvLU1H?_wyGAZs4XZ27dJjo7^uH(2i0sR_ zkRF#Nmq@pI(pj~2Mtkf|o>>RINiI`1Ks*2bIwQ&RJ9<6j4G~W-!Vdr~k63R!FQQtr z8XK_h;mKXZr#?Hd0ZNyn?C?9Nus{3p9ivewM~9S(UZ(<`Y}lo)(d^zlBO-1P&IQCg`?xu|M$5P~i zE(B69f>*QIs~f?uawG({jc3a@8dXGK`VZ{mjYdTgn7x+$iELpx+|jeF{4!eXQ)|B~ zDDUBSjr+s6Z~`JSB|;``>kw6&MC(8Ia?zSE)6lpmSu%WtVbvs$-*{X^q;tWXU3=Gv z590YrNja3IY%-?NRO!3JXc5Gj4{w0Iv&TrboAt5;w~=TTBI%yBMmVgv60|F4vZS3x zGJF01u=n2aQB>dG_|EJmn`Af1gd`*(A?$7fgkD7ul?>7)Gn3toAYJSf0mTj`^dK!r zxritcK~PXYkO66-N$5dQkdA<00YViJ;rBjww#D-KJm25%`MqAx9}ju4b9+7a+;h)8 z=UhE!-+wJ`)9RemN=Ej;VIfP@n7mPm4{cl3Ex?MdH97ZFiT2K2s=*pHA93o+bL`&z z0~6VMYjV0kN07NAQlm9 z0fdq8cU;l9BxhFCyzRdC0{XH8B{_vw?#EL&Pj1SoNdqx)Q%;suF9Gp|saU%y#}#!3 zmgxmR73hSV%^>9e8&v%dz#v)tDvph~uVY64lbq}JG-~<*D$87RMSl2RMB$)I2Lc`7$mI_{clgaNh{ADb9)_Y4%GWCMC?5aNU zm79D=Hv?FK(B%%cc#Cl>@XZz+21;?Ljl!r{w&rA1z7+#YUbOhZW1(X$FuVg>)I(cy z`lc;AHHw-*=g4q*5j^~anG8?yDYkZNPSxt8>pQ|*7nq@SEYHbDI8grP5!kw=aF_@h z(T7X{;%$*Xw&v7K45^hT5ogFlOdvHX05j6yd};!s&CwuQ_lh;>=$-` zPVT{~?gX+dVQqHiyqeMzM}HIuE*$YY@Bs;dofvnT2X^LUhS3?@%$C0%mZT@_%4s8j z-S_zJoatcYUEG~B0)-6TlQRjvyL)m@h}#;l6MMlz>%!{o1J~#{Yqu|_dE7B4p7?YS zUW|}uW=O}JY|1|1?=Eb?J_D-u?!zhlQ&3Lf7{918WBl;M$=}BBk+Pf zC$Oev@lj{2!;FnCma{*@?csyz7-_isB5k9K2uC?W?(FDxynS(i<-NmPF zaGnL$Kp5WDy#d>4co+az(10~x46Kk4{T(Lnrx26rep4Kxe}E^8-h)fw(Q;J~8uB%& zf8?Q@7C9&VxvAW8cmm~~_s4*;M7eSt%tZWn!z|AexO@x+tq`cN^SApmz$IrJXrp-js%0kE5_*yA}O-q7bEu+ zn-Y>+M{c|r-Glv}q-@s*R94;=FbME;qA}rtk*Ug0@aW}L6)ikIH6vZ0Z(Y)TqJKpi2akq(!E-Dt%$U?sH`yI!xl zvOy573Y!-y^tYK~C10arlwUx!f zN9@fy3g;$%Qb#e?aXQxVkvhtM!t<%DL0zRqiy0rnWTQ0NZ)OpXh7+RV>=T@=h7w61 z5e(tp0R{)OxUO+-ES%G6Rd4-_e?h}Y#V+||DX)??lM!z@ zEoLx~S2zk`yKPjLi%CYwBqoL{-%mZy_*Eq4}^a~*eC&BXD)u;yKrha(q7lO+(Vw4LR5RfYke?sQeU36USiA#p3|S10S;O{p5S zI{_337_N8?cx*Q%Q@k64_w^K)xXgp!pXl!tktTNAeaWgMl#tl5n!Ih7er)h z{{bL9D)n1pbGCCNNRUYDrQ9zZ(`)rs1_&+Rr)zbqTrTzlZG|_~A!P;cp(_2PttrNR z2yV5d6=9SLAW}|PQvzg~zggUZJz0CXviNCG-4 zJOK5fnb^3#N_x`2MXu|sRQuP+D}9v~DFL`c8?!{foei=GMpvFv63~^$pH$LB>Y3r4 z_#_sj&sz;m7MmdxjY%_cG>43nR77lrB5waZ4~Hh?2|yDu0Yj^O?y0}k~GL*1Z;WNs(idZX+HGNjOo*zJ2xK=acBrwof$$_`d9F>7%3Y?tIm8Q5L z1L~;MA8!FfOTRf=o1E?Oznw#Ln#>U7AP@s_0BmQHO`Yhz3B1iPN2~-$#V?>zByk9y z4lGZ=n6x>i3W-z{TCGm7dL_W$(&v=M>6pY!pz;tXh`?~#Av=YN@34E%Re(mE?tIW# z`}vB{80AQCIDNUSF6_y-A~aTrjPIvp z5;USBU_rEzL!;f{;I*;K{gi}icdRZj+5m507B@pON(6YbV_Tpm@kGKMHVZ`&jQ&F& zz^Fe@)e3pS`v>!&2)Vxj^;87BLo3EE4T()gqrmn%PmRJCz{w{}+Qe@4S6bEFl|Wme zZw@6urG=o?+#F=iAC30{eem+Ah6d5DwzU; zKX^fTL;BQ=gTBLJnE3_|gJlg;sz8>79AK=-jhN+WUQXKef+CDXPd%tlf)R_VNx ztsbQGHZO|iJ9aw+S^#_#tyKbFjtrf|o8ni)cn+@<;)wv|{xn}=0bc+*q*kPf?2W-n ze!k%+;Z~(E)*o+=pi6GcRqEp!wH>G>yZqV4246zekMje&M@0nT4Im8MFc zvL}ZsT9@L(Xn#MK&FBIRFs^AJb?QI}W%GxKJVZ1?c=eHT*rSxnOko%!%4g=OEGRtc zWhE_@vV$+=jKTjXp1{fzSdl<}SxLmhyIo#Z;=Ye2?vS5Nza$a`Uq&iB-eZ?pOjd0K_pEgHJnJPs0T=uv`c5s-|MMz`~ zhASQ+Q6DuN=qQa28@Q6jlw*qLZ_g6Ba{v}2X`2$G!)LT*GDQDk$9mS66GRr?OlYj??x()iedK)-C46y zN_xcEWpVtx&$^FNQp52Mb1l3eF>I9LVn2^o>Ju|CWsK51stl4NA~86gW8KI67e2z$ zG2pUnVjISQvfRbyqAa?F|E6&~8{Ru7l1cmW!dSQ49c|%udfRdUyEaN`OCos>j8+=c zci?CxHG}RVIkTIl+k~}8gtvGG;dD`S-=V7-1iR{02Hs*F<}3_r0VUOu!!FB(Uyt%Nz>Ryu** zX$7SuLW4z`!(M$GyIl#}Fj3jh22KD6W)7P>NvX^lOjNQ_$l!@UeRJ5%iAqf))kz~k z8b0eLDNe{K9iODMiXV@c9t{4!EfQS;5P+{US;=_d7CrxoPJ@R}d}&-M@Yq|}5}`T7 z16%@z2)&nvQyJjZr;$Wn7dC0KF^T-@{=j4<%Q`!#Uy#6(rYNzt<-hWGIsgWxtkD#p zuyL&Y6eSCv!BdpYed#e5GajCnP0lDlDAbp%{65GcH;~2x2ZNTxGBc-wM*}so&=9Ez zFIC9(c^IuAvpnu-g7g_Kec`0XUkT}lgZnkTNLgj=A}^c~D;2TasY>!AUu~(1vkur~ z3!-tj0R@BuT_#+hq8tE#!<#7@;K-v9NbKUJw^I=aUKs+z=`EP4;1ZOuU#BYd8h>^Z zFWvG8G}Ar^EeMmpziouccD$;MvN?M?OkTJ@9$0Y!>-3J&-1>1*I^|>I-%;x1e>AbO zJSjt-m?6!Iv?XFDFyeN3{+a}NLWcZyXlRstV|=naK0_`H4UOcX<1*y2p`j7-&SQ!4 zm<)MzXsAX02<48-kVo>+1k?s2qFy5~R$Nt$04hRcdyfr_X4T%# zi;My^5U}Bq5T=#)cd_Hslvq3qa&emC5W2D0=}LQA$X%u@S}iVAV5Jj`5b_971aNbN zyaF$w1s;}RWz&@gy$&Z6n~-oPP6L2s2?2ofK)@CeAvQoAyqnYn9dTBRKXLOl@ zwj!S_$`{wekg?PkqlOsbra;x?R9V}2Hh6|oCH+UBe}JwFu*eOt5@(X$Br_Ho+b~0^ z9(8p_0w5I-^&Gn}LrJyjdr>cL7h`8CE%R4GSqNj$&yp?jKTv2(?;Ri_4M7fU)DHOz z_<^u-Bi$5XF&purvH)5zHRmZ+p~2C1p3+f3=#-C?_Y&vAlO|3amBK%E zS1J@RCM;Dh3WxMJmVqRR49>`k<;s0D9KS4A@~u9>M1AlV%IPq)*t=S(3$FeMd??M* z)k>QvEo^jwzs^9yml_X9Hk%{Sd+9#HuH$uK(>rDg4aJN)(yk00L8_N$HoCYPC(N!aSQ4zm{c1 zoru`Yh~4lXV%t)YkWXyIW^7h!S@ochVpo_KNZ(>WIb`(=8AL)Pv$rVSu@G)-QFhxQ z?FQ70eJ_H9qqiy@|G9;2D0s{^r8dV#B*?gGn=&l&bKD}x1zETbY5BGCs?fFzHV_=3 zaGPc67h^Gtf(fD%0&KHGz#hwo>y4b8%#{^^&4F3>{+_~PAPFMM*QfAg?Dy?TZLT2m zmv`^vQYFE>Cax{}@V5bpY+$KkwX7BdfnKtVH`A=u*s0Ws`u++XA+U&WgxCoz{KF(e z9BRZ)CACJ03%i~{y%XV2$o;}3YL6ee6L>UagG+$~pJyvdmF)ay&}_OOG|89h_}_t( z?%)-=Xp#Cb|Cmp3hDZ;#jZQi9xQ^!E(+m7&k{(Or+Z80cK@|Y%q%5&%oM4haJsd;& zhkRo|)BYq~(ms`V+R(b!vR2L1%C4`B_xt#b6748^B4|U$d!l0CeaKC{+GgTv`qU0A zkzW5S-TlW-rR)Ftt_6(=ViJcetI&;b$1Y>nB8kA-!1*SbRGI*B0ikeGVj}r?E?MJ$ zERxB)m2`*)^x3Vn1()ID-AcpGT}WWXgbQG*4FHPESy!0U(*@djNkc#@=^j8W9PrXi zT-1>dH%y0p<^ubW6ZTj$;kh0BVCvHnu0CH4iND_9f)zp(}A276F?Z! zalt7PIE&e4j4Kg*assYVpwQA^!h?bqVojruuq@!hE1P(L1QP{7k+22;Ra1Yo$~R7d z*q0_+i2S$q1yw~a5ANEdqcmz08h`&}R$X@tPKmnjXx_-mS6+u62iQzWzl3U;PQN7?6P z%I9ronbD0=8*xp!Re(CFKZ^emGNs4n<%k*cOQbAck+o0!}=v z>$hNQJkQ?xR(UZ0nOM~JKSRaH@h_MdwMqaXj)7hO9T6iXdJ(b*7d3hfche+H5^bJO?y<4KbsLNTd^z7+RWuM<18dw2pu*IsqbBGU^$%k zv0ktl(YxI0BVCf1{W~Q&rlbrE%i!bOjlWZB=9hg8*@~Mkn!d7)U}6f=gmC#V&e>E6 zpj&!EE_{c4qR;oy+(bwm`hA~Fqc|M2dCH$wCm;^YaPC`jFadEe%fNl}aQcss9X?+f zQd;E_Q@+nX7hDUgT;Q*==yakSE5GTByz*lrih0ZDTX!Z=j+2M`e0$+bl85f^{dgk*P4kbVg<&-2+@%DdLw_&!fbSD*%+Hr;5dFoRL|hyd!%I1PAOW1FaG&qgo_NeCpoqs! z`-<}UA>&&>MhuiE1V=tqe}!knYwbMgx2S>=8@}(+3mb|xd?(%`ALh+S$$c?C-yU?r zj`=p?<}FA-1#v##%yOEFNMzbrK!tudU3xMJNijFPiV<5AQ7DF( z`}QtPgxf#(-+s+=`QjEME;#px02ir&!7l||qy$E-7{HCr@_hME$QzeaMt`AaP-t*Q z@7y7H_D{u*V+0BQ86Ep+VhCJJDW{bFsTj=?9y$QO1cUyjJ-`T?4O$Dt0<+zm-66LiYxJFJU@nJ zBY;76-HS&#H+?V-47p4MDS+Lhy>Eknd;oS2rXE(}tI-q1xGMqi8_~}t(58c}44)&= z|CCG0*oebQRq>>gT`tg)n0{D^OY2X3AyF=HNM91=EP`@22Po&b@g0bAj=KfT0ml)g zx%;;yFubWgliYg5JSvnfuw10$qOpxq#eguP>>*89xz>`trk(x zX6wd2J)%?>zaPi;A5l`Wptz47p5TmafB<-sj<8h7*$hdAN;GjLp}3Fk3}KayDhu)p z*2PmnCL%qJJeW4hBc@7t4Vw1k&=w#7SM7AH=J&uTkoZshrVw&?K0^%BSCFnSV-~4X zNutEeT;sMiB{}TSR zBa)6z6-yIQJ!N|4U&5cYIlv}XY~sYD?8q^t1&*_c$CVDzC|9>>IqUz@}D#T zL1H!p!u`ib%nlb6Xh2%TAcT07p@M;QqyIe}qFDY(+(8(f$V?;HB#=q#C;9sV#s=W) zFMWBKUw%cNffAp$6A=n_agToqiE(P#>RJdIf{z+?)6atZQif1K@< ze$hWThs!-kcW(Y!dBbAw?yn^s4eM}GIg(sxhBg9Jyy+S?2}Pmlpq_9++wzj~o>0mT zUQ(2_RVi)3dyfI{-D#&!gfkL2B5?`e=PHxSl^No)ee8)V0K*=7rOQeV8mA;sY+rKMnBE4CM zZbItAxR-`?Gf3a|x~Vk4giOAvR5Lmz8Xco1BX#uwa=|`*+f4=UTK3ShZ!391BHd5k zZ=8fhN4tKI6OBhfpZ)>Pb5~}$gTcGuWVP-n4)MBEfAkLSJR^(u8S;7#HttV_g?MY; zt>E2$S2+@l)feAW7K^xr?jowsqwGzhnpvmBS5yS9wt@d2!USv$1QE1E;ru8-HMVpg zlgw&@_}e~K!>qQTMm=FxpGKotsadUoVlSChM`b>n0CHnCo5*5+9N7z5b&Gl*=CZp* zebWXhVBkd#R{AN68ZI$P<07!HO0fRgtTo9O%AY zEgab!B0FV64y;*-RuW?WkJ<99YKBlNn2qo?@)Y{2iZ!YVR`X$mT2&AWNO4O|Q*ize zoIr2>DoIkbybOXYE?Zrb$srGLr1f*%?|?@jPgFlweF&$76ds9w1PiYnrJfYT(fgR) zu0BNHN9}4#{n5U*gkxS%6$%%zr2Z{bf5)!2CIN%*qSa=`8~~#lbCBYn180nSUt(!O z+i0_+GG1DBRN&Ou1-L^P&mKX+< zQ7@Iv(y|kJ- zK|ltnwwlPEcdEY&%h(exwViO0Epn;VQN~`ET1Y9nWU8C3-5rwD-I2yStv9W%MhF;? zhia$?j3Uxm!pn~sfs*fRWy)5-dU+G(cnI4?${B!6S6aK zL=w@=#>^%H5f^gHJ4t|G3bZ+DI@$C|LRQ{T z&5!^RsMjKOw?`27uRF_Vq~1%zAi}bXV9rKaO(8&GhY*^50EvN=JK4jH)hQU4y^R5} zmz*rRiK;@ErDqd0#onE73h0;}C5>#N-YCE0<@_Z`E8C&9#;a{jWeu9Q?)*7$!n^9kuesyS_8f2(j4vSP8gEK zWTG?)l^IT?uYDgT;s0E&N25@#2k8rgaE%0=WhfLovHP==8SN8cI8d#ef~p1JHN(0%iG_m&m<*m7u(tFk zOmJyxP8(820@X*lFNlTRWgLf6M>xoVmqqR5_ZH5DQ~ue;Uy z;v&3E?N%FzMWyVpTkS;O8Xon2O4i$>HW!zavUfd5hwvR9HJ83=UUfs-o&-8!30MJK z_>zW{-#fyV-!axfQRyM(F^bxZBv{rdYV(#HVnnA%rWZtGSBEtVGI@rJNjkjY#=!0r zF}&!vVf%|9OU#!RvihppsA}oygpKc0}3lKE03)Q`Kn+TTCaTj`CSR;R`y2Se7X`l+GnB!Th|enp)VDb6ZoF$HRJJyMsW2@f~f>f^jb zd1X>+qc95saQTB`@k7DPQvhUNa9w|=K#dE_;>42~f;|8!I-mh~i?10LHC}b z3VHgjF{&(d85IR8mjYcR=mQ^JOOW+*az}#n^t*}N1S03*WX{m z=mZ4PVBDJeF|l0#a*A40X#AF+i|!lem#Lb7Jq|9sRN%Y1#2Hq;b95m)b?BLvurPXR zvYHh?$zpcpo8J*(yhsp)z`lTYZh6tz~ak)n_E4tn>j7i5Ii(n__fFK$G%S-B- zJhH$*aB3o?M|W2A1MZ0Qfs5a-$)fzlQj!KRjN;M#7Kdv~oMox3{y!}Hr5wFyRP|Cj+ORUsxp z<3!^_=W@&xE?yuzymd;LG*^G@eRYsUEdNa3{-OF?7&*RNsP?q!Q&s{PS)~=AEdOl| z2CY!nfI|_O1FYPNbMTkjTRul*5@0Utxl(Pcmwl;@7OBR^R;y22@<&GjWMDa+))u6~ z_^s>cC>!qMK(U2{-HSoGiUGEVDG|?0#=3C`01%)&C_+$qe+jeyHO%&Qm=MP94r-r) zzB-@joyuB0F(8~}uUBI*i0XQ^N(wPAq`yNoaCM_Ha~%%BI9$xd%UsX4@zj*kGJl z%x0&iH>#5yS}m`OuOZxJsvFhx#L()n9a#9iHrupOO?H$UqVvuO`8S^{QaY)rep+$l>`S!vo1|NXGhYRksHU`=?Y?C(GTYZc+($ zh|3^?e(J$ytK%3x@j*nPgO1xWdQ_RU^(RMI)VMQ3J-ZDbP;8q{!H_^oFH_NmW^#p~IDeK@0? z(|eZT;2u5Srx*|cPzb}FGEQP+SkgD3W+(4go3Iw&;4D0b4f{rITWw4fbV)(YIIw(( z2B4oz9Hqkt&|WeI*RyI%v0xLc`mNeA4vj$4G|Binq;u@mZ`ExvW1?`_KnCn!X6akj z>44f2q84KhsLk8=z`>k&)L@(ce{sPshgt{6#zx<%FQe#%->FTgR%oK3R_H3B*7M(~ zts>AH?3?g4_+D*6K1>LFgTDuzfWhi;P|cvh8hB70K>VpJu`YT^T?Ut%uBE%Oiw9NW zPo*DH8~tx<{LDktczyFBwG)FJ^YG2_XyL4D>Tj1RFvk`}K(W6h7KfwMh!SMnMQT3@SK=8>9fa*_@-OH<6Vd zRlA7g8=3Q%I-4~+u6AW>kEtH9q#RqTnkW?mlE@0Q$O$!v8LVuzNAgTEejwu1E8F_Z z!(f}*L9Bdf9urQe&j<8sAhv2OV$!RbMT#!RxuVN-a-QJMB66PO&WYqa#hr!Z{E<6H zlhepnKu#muosDoB*=~~aG*5etoTr?SOn^yPa-ZSBhdyJsPhj4zvf3vBd-K>cC)Kau zbDmNM2xr;kQ))+i4xPgB_$;&jsAl8S;YaMLS6RuA>eKMmIE|h2EbDe!&B#9+#Yt*; z46eKD`V9&I;hqe3b>b$}ebs0_Ij?c&B642m&iUlL!JWmyv~z-KXOZ)Fo?tpTjci45 zR`ca6q~M!8MFBZ)ap%d;Sn3(j^=DbvGit-+u|Ne*2tb5!8Ge9`3&5Nub=Ql}sJFvu zj_3S}W5x??M`VXIVWIxrud1sVWIAs;H3vQ^E-eet-rA+zke0e=A>S{@~ zj1nP1b4~z-FUb3^iJ%2uK&e3OqWta=T!uheT-v~-dRi@M3^!DpEpI?FleAo5+B8tC zz3XYVaIzDHWP|Hz^@XWyZar;_(Gk)d*?%@Kh3&IGYlBIZDfP7)0w{*hgjBY_zLsn~ zegu|DaGg?KU%M}rWMk;`XD57Or+GwoG0i(toUBp3=Tn&WU>KG1bOWsk%I9J?U087g zEe-6x^$oP@v5=@UIR$xip|6FT&e$`OP^@9)3nU8M7BI3v+zI-HMp{NCP+oCu(CPs! zyNyP)>!q9lWXrs$jh590M<_ZLLWb@S+AmG`sHwQt?CJtdX%JU@N-%vpAZ<@fI^1pv z*bwl+^Ij0IgPo(B9V_dV+G@p-;E}FSv~6kO;V28dw^#dXwS@iphyAr9LhR>)3r7aj zVjTcJQx7&_pmra$hBgh<>L(%&H_xa)d?<9w(H)GLu3KKvz{>oBJw8bLQ28y2u9MJM zi*zW$1)2c}5kvQOII;5IbO@j``_otoWJk7FOjg&0ZNy2Ap?o zfCO+Eh)%)g0iIOLx3nthqb3Gn*J_Yf+$O*-DGz zrO7zz**+B6GWU~-Ec?Jff*Ltrt4CGKbvjh8?>~)zbHUjfoiUVx-`pjQyC~lzww|A2 z?$x$h4A27cI;d7GEZB~~Equ|3-J=2EVFg;#v`iBus|+i5Xs1B4fQObAlO9PS8(W~! za}IP=FJzzLy5IWlm1N9ZA=_1e;W^C83$$twHk3wa88L-lMne^*8O(qQ@`Nv$JVL8i z?Hn$jMX5JPj@~G+HyX(0NFxaX1z5G3G(t-XJMvx?X)*g`gx1*e>n1>_)E9jbv*oR~ z_VAm;uKqWi`Z= zfDM5OI2&mh4xBv0)hJ_$QZlKxFPdk9oa^F`V`LEA(kL?XAy9ARL#H9gAdTj#HI#<} zAiDf@L!0z2&Rul2N_MbLqcp`zqlr<3ex{b(fCiIplF^id)p_~8+UUee2)sAJL+RR& zh>as%Vn2=2>c@S)2(&A3GeCYcC^D(HUVXGyJuDpSNx)jt#%q~@6Zf)D2c)p{FP;i# z6TF@1sQAfvtr0%;(+8wHV;F~}%yIKhi321;NpRR2R=os1b=FIC1OzRAL0HGA`wk;G_f`y1Gr@hy)gjv zOy}B30@!zWXeeuf)`~_90@BbO)iRaiP%Gt<2J#P+tj02)E&NxWk!UoN+6;M4w8LS7 zluFxZHlky@6n1lh)(i}!1{1ZWVNe%w3hcvA+9a|3iCT1P!?rAtu#=-6jGF_>^xRx8 z4U1v*+6iojnU>FNkMfJ!%cU#la%h+a+wEF^<8Ox@gsX6qprMIC} zC71c3$BNP{@_6j;ICs!CPs?{K3Bs1Y$GH&+7!53QdGvG$=kfiOekAEUu`_m!jKUe8 z`;Wk=p&^HCi+qd@reMFiY;k}9EC!^2lJ<01$FXIZus}G|fpbHAQ76z&W1u%p^bK?* zR)|puAr+vxV{FqT;HDnzr%Bo=97jqgYdr+(q%&#g;yzZVNNaN6duQRHC9;p3fG_7N zEa}1RfJ!0T5GXLPTa>eMxmOKfpIQnq zNq6b}6LJN|l*LWe5+4o>qDU)}%OlY-vIYnZ&Pgs-(>V6mFpRm#mzDYXAvs8t{b^jAi0y1lS&#_0xp+1~xKtRyetA!;uUqG9v&{ZFwk`D6(S|*=D5Mm-QOawAerB=uy;Yd1 z@7b=kihvQ9=rZl3eq^0?IVu>aBQP!!f+^L0(E5OXQ1An&pjG;gAGFCLLc1Q-dLwl8 zQSCwaCLYsLnRHCEi)Dvd`Y~-FQX*`RfN!@GS~be?#wo2Aa{O>gdjh_eKWdNTGvh~1 zp*&}Q)T+a4JFUG;-jS!Z9`rqVTB{MZ3LLy}7JFKA=ylG3)X~{lZ3c;))H|=W$LHnq zTHgdxkOrA(Fx9bWfUG0*@6T&>>E_)0i}tfHfnE3o$Dj$KE2^I?;;~q10(1VV#ivdn zDp=zMAO;Jm8WJ4Rob-@jqdnMmPrG zfb;}5>^E&FK9_&fh8Y!OF<`GEs%HWlenG40njku(L?aNRC;FOaP%Km((tV9|jf|S0 zSwb5EH3JvwVZPKBYkxifO+<1Z5V(p8Z?!~DT>)*K38F)t2;VlA7+iNXem_I z70nSdfjF9xboc>7V1oYo742OrF#Z~r%>;emHLOW^_g>eEVo{{PXN!g!-5Pj9s~wyz z6b>o6z-;j&6>Yc^*qR$!tw;T{MRX_X!fq1;CbZIFHV$DFW2_k;)K`dsAQ7#mdcSKa zzSZQYm=&`{37+_!kJ&JM{F8=z)zCUHGXcQ=OZAaP8GAx9OBFL?W&)Z2(g2tmp$4Si z;^0YTtV23YI3y#eO&cF!= zl!y;!WdEThK5mRFx?qf}r6SG-5k10CiPn!~~0{!rZ8YqN){)bk%X8_~_u@zB9 zAh;sR2n1I|8G&FQ#&F&V#TbEDAI4DcaEvkV4q*)a$2;12n9bF93Auv>v3QC8kU95Z zK`a=}hFfy$!jQ!7C~XB>aeT~8BK8q7 z0zd>7TzsSLZt%NodY>0_uh$W-u{G^-Yw6MRayyGG?}OYL;$53Q{DWLggaFvy;@sZ& z)c-K|IegfMxeZe%RspOwu}QmaqfeS(m^+~m0#vQ2(HWJ zFLTp`?BD0c{r3TAU4Vas(R=Fn17NHj2n+(t(R0TOEA)eU?rbwQ`WM&c>eyy$ugiTB zTk+&|xm~b9|FkZ*T&T1Hh9hMTC;oICFbZvj`Qb9brSch-65K9CX2pwEaK%PXJ%sxGk+YB6)QwLDBSh84;`#u+s zQ^vB=L%C10V<&UnW=mWwOE{kUpkD8X+;~g=^ukZ^+%SlE;xdB#CJK^&Eb_wlA*v`J z9mg-Ualu`ME@m;?QaAZfNFadB=XFAOC!{#Jthllq>oD=GNOk0z9am}GOUGnxs7Ke1 z=hmbKzIHNq4L)d@LwBFbJt8Faz&qP`N;!%iuOtu~4BnUxgl3!5xqX1s7o5)ZLW=J8 z>D+BXp%zG9N&(g&vo%}#6eqc{Y&l;v$ZhF_H~>P#he~@ zV==vtCsFTm zFE>pDH0~DNsrnSb{U8ZT!t=WENoP-)-3f{1m%la9wfzGo;(UXX`-)tCnN2dgzra<$ zyQf}ibvH|AGoN&K)LUe^zZTft>h9fQ`Oo_98tzO%zgNrcvYVIPz0IB(?0$mXy5F6y zf7HxniFrlDZkGKaS$FptREvg4oKoi!%!Ob$1zPO!#)dg+}?LSKY1}{7ppu#1>v4#bOejFpzyH z9k!z&f2SUS~6x-?^>ljCYTVOM#0&rR*dg4|r{`3JEHi;xEj0 zzibu@qu9M2?lpSVx$YbBY~%`eCG$x{vK8)!L>9lo-B9+ok8^TqPxrI>Xaf#5pW|R` z_+Zi^9G4uvz5YlQCN#}UV*4)STG`U!Zu_cL?y6D>DlysxK0~lwRCTkj-QHyJ&lG*) zad*1tF7hR$W}mrjWCE6m>OVj>4*Y?XoVEGphF6AsFRqh<-UAI3U=qDdr9P< zDcGw73H2;L<*sfKuekI>XWcO(InJMRM+%h}(CxG!XHg}%uE*G$q-!o_{n>qg{sPbl z#Evd-NQM(4nSQ4|=!CkTKNOb5{LbW{GcD+J1f7{dXI9WzH|Wf77<4xcI-3Wb4+fpt zL1&wwvqR9?Iq1}aPH)iJHR$ZYon3kN`vilZ3Ob()I-ybH@AKfG6T)`>(AR>_Vcf~4 z|Kh$Y-c4bc{JMI{ukI^COmWEUUAxIjF1QmKmfZ@@`L&xqs4(U{+?ex%3MrW7BIf+A zG3O|r=3GC1(cM|p&t7&P5ya~*ee+d!k-+-Mof`^U*i^Z5wTP=OXvc+vrdTa^u8$l0 zb8_blaEpv3M>g{4Hj(9CcaNj|hpz)_ga!JU8}38G|Ai1*Apd_rNTu8EM?ix=9^t9M zhTV2I#)vPy?S73$KI@LVAHFl~9vA!aPj@nR)@0ZJ1oB;=r`&a)6szNAmv9uepK#x+ zG?>qT8@DCoX6b^b8BSw)g6CP0JyXfkhOM-CT8h8B*ky}nDWr+@d10PMMYQ9h)l)Yb zmJ?P2TO%{DHQQnKbm;Z=Z+4Ih+=vd}(&d$REfm15=HSU52gFAXUv$B0Q~(QRs`Vt&8x?q5;T@@(l71z&V@87=TWQc+~Ex zW2U}i1Eaq47kS{OzWd$Oce;OmFV;g3*X)h;B$>sVz8)7})@Q{Bd#p>9JvnCawu|*n z@jT8dSMjuYuqO^aPK*HO{c_=Bfq3k+W%5IaTn0)IFVo2c}Z zs(AW{;vX)3U7BYCcXX`g`BW6|rRdk4o(!?p#MtO~dnLZ-Va#wUkzvX@HoB5ME*OST z7^s#rJ@JW%lI$2hlM}d`Cr6b2e5U7&9UW8}c^ZH&*WYUF`9UDg(&J4%@6$Q$W>e1= zGt5A*YwnRzH@nx|^Lp4pK?u)h%kTH3v*Rs15$uZ=p3h@2@ACum9;Nqwz!NJ_j=?QG z;7l{=LC;ux)Q3Gu`sWXNQiy?#uvB*XAy0p>r4iAP!U|di(y{bx&xWuqRv|H;4Jm4r zzy@~ol<`AZb|+7-N;sX-`72Vk4uwh^42dt$mv!>EFz0N|Bc2QRZ0hXE#AkOKPs3Ix z6Kwx=QuuuEnfd2QVfWg2?xBtM+IniB+-$}3HsEP_JI`cdm7`I8r2j#aV9M-Ilt--i zzn9oVWOp^sU^YD0lY}$>j9kyBkRsUc_Ecfr+@4nqcVim#>A^u~qQ_Iyc9Dq0dnVZ` z9brv9o{7RKw#nm3q**=W@yr*?e$n6ZdOnLlv2}ZTy2KoT^+tM~fy`h_NA#&ZJ%dCf zVo20U@7%}Jk5cN-1yVx6-$m~jl~b9-BR05~*9QUfT-56h_SE1l z^1kSqU^AKxX+X z9A$@ZaAFV|7WB#oNMpJ$7yG;L7%H)JXTIg>+8PxSTYv{tNDk3tj%^G+J1_!Lnq@O7 zc2EXzV*Q-q*>8DV6l-$8(CsGB@utpb?e4ccb>k3^KZxs2*NY6vYL_X$gOd&$6jP|6G7xg+> z*U_FDO?f$V#Nb09lB}zl>wlAuDzB7c_?QL!?2FN!rYP;)Xix1l%14Uf(Q+)NBBTq{ zw0dJaRq7!{I0iR(#leRc?+()NlK7SIGDKw}hTs&4EJMe5TBB@z4DZdEF`k|9EgcK2 zdWY>8%K`4*SWk^=D76x{AbRKp*WxZT8neoaH0G<#I1Yy|jUzbJ_mA_W^T)`>d#*%@ zMZf81rhA}|Q*=RpX{N^(OY68`fu}xwmo4zTDwh4K*ZSC#AnL0Zd0@Tip+%k+LQf`d zuH=|mDa{Iw#-^RlB>l#xo|R^J7Ju$Z!>9Cfq=HcF)JC&~N&5RsJ#)f^FZBmjdFES< zwYd!2QPBp^bu;EbAGg_qtIjXku&tiQBfq34`bY$bT^{dA)UR&!yhMA}vtMIbV-bJ3 z-E#_U(`S`>J`keHe!;>3gT)oWrtb07(4W}}tVvBjb=VWH&pqlHDzK;bcwCeNLE{8i z5$C?p1Z&Ge6Fl?H-x9TwdO$bLj86GoC|)D0TQQ_#KBtR(OFn1|AIGtL34-XRe0& z@@|Cs+T05DHMtY&bKMK|#fjcv4Ku?+JnWJ+)OS28)VC)()VEFw^(~I~`8s(sE$pYH zP@gj`)Yroi>SLLqzHhQZebMzoeH|Kw`bOOs>f6vF)OYKlP+!y5p}s-wLVcfh3iw)B z_?YwNJ3N74bf$Y3!zVrGeJPBc?Gfr5)Hl?3>)C*>FpP>bvP8cW2u1PNxpggldxu}M7Bb_RQ?1Ok?;TpNvqrBazqiry?qV_jmW+y1yY%lmXV3izHHzZ z-n6(wBAEpdAs~vhVD1&N*ChhXQj8Q z(2u=EpRH`pO7A1^om}ayQo9Q}fx<}MN4o36d#o_6)la$v^W12$BTgP+STK$NU+v{D zy^S2*X|GJ6qlhT2h~^eL|DGz7ry`MUy#9gX5QfZ3|-!yVrQ16mP||MqdG#uOy#}f;!~I~=A7!x zVB&6XZ9DOp<;qSFe^A0}zS~=~O;=oo8E-*2q5%JNLgH-QQu_u?osy z#}V|KZ=nza`lH?6XJB$VYLB;J+RZ5`;Es+EOg8CYjLF7{e7c>(f*#NE_ITUq3-)-A zMCuz4dLI=c3;poH-aP1S8MvCP`~!eTS56~|{kKnpAjGC#^EQd(w;9AmWlvPGK){~&K7p`5&wF>`Mz8c|uUBYC$P*=y@^TdE zru7Gkf?Xve7i+Z_H6PsZ?nkmzB>S8 z#%y@z25;lo=7$S*R(8c(nca88+Yf~l-|(i;$nef$tRv~T;_ocme}mU_{s!-y^LOtn zd6^Y=Fu>S|Dzt^b_9I~cij@wtwVm@G4Ie||)}xs{C+{P_`^%iXSN!fqO5SGXQu9XF zuWtgBgH4T%lB_8oPN?F?v=u$8VTV2jO&?K7oU|q z^In23Mpmypmw8;2jh$Q%BD`;}yyelX^?-4M81Q?!-z@2@ z?!dg%d=y2wp5vjE&lk|cCDn3pR|*5OX36fX_U zyNb`VFXv4c-qG*8ocF7MZRq@~dH3Vvcr9-|7)Zxo%ezJF(?f6OHA^offP);S!J36x z8Tf!PZQ+7tV_U6x`xXvB$HA(E7PNbpb0MlAeU(mSlr z$h_*!X6aMHYKbJogbG*tJq~!5`8~<-Eb@C`?_4g{+1inLnHBR^NKqkgg;J3>aa3N@ z8a^tK+ComFZGoQgHrGWP2aU?B{z!?xa%$swc+f4NA$U&uW2nK0{2pp>ncqVVF4ft= zQF)o61qq=kgwVV~XsJSIeF7Eq@aVkS`965XIMdm{=c7SiBKrFvZOHT?PROfNMNaDRAq%Z_hYb0aew0JV%E!_w)cL$F#OoXEf#A1b! zZp4BT#D*FPNBNG1g1r2Dgkwp`U;cxoaLCnjML8R!QDKnz=1w+qOr9%$ad|4*OoZ?W za~05+^1dsn-1@8$fY%fDT}?%|{VCANNtaW(C0io}26zFo1j+!#OZ|{PEiuW9OH9&+ zD4;N|d{Gq?9kgJvkc>SMmqlUCOC)!_iLSAkHwI5n? z!S>5#>)6N%c{TD&)_oENVIhF&Ny7#BoOk0BqqTI(F8~}N0fPPK{VM)2KyDx@b?gi* zkXyhI0NGZK!sG&!Bj1DzT~EacME2Xg;j$DK9NA2)=ES_DO0zR);Ry1YUqr0_K}g56 ziFwJ^;yV_c`d(mzCgwqToK2jVR~zsA=@awFuGBSrsQ-=rANIZjx~gLP`?l1Zazc6` zxi<+AAc4?(IZ785)H6q=qdt|Q;`2TK?>#j^MVgc-F!ZMM8Uz8Q1Qn!%f{4?{w@B3sebI+7LGkf;z*?Z5PJ;Sv7(sAVz)_yM@NOgnu!${r1 z1Of?|As}JoFs*S2A;ASp#I9jlj{SYUaHN*N+b#SXo?#oVOxCUUD49e5nAK2(YhOJ{mq-Uh?%4!CEjc zor|=3&KEKr{MTk_DSUB}_I~u*%l_9;h{zs!@BjR$Bkd%$NbaT#8uPxE=n^!R`aTwb ze@7w4|KX?zQqRGH{7*y>;}>gtq#gUQBxg|jPW-~^r36E$+vv-qX+|C;7kWmt)<89gzgGJh?5}fjhKv)t9gwvTB2DNn>Nb6Fh=tv z(H0GA6AL99daL|YCh(bKz*M^NLu0fGuy_V>twMoeJc2L+i!KBq+`R*-!FI6|OeGk` zBkA8xxPX2FRAQf@{TnaTz=}o5!fRA`L<*Nt+|m?&orqfxuTK&Tq^S^hj)Nd0Wy2)t z{wTyIdZoTyKnJ!KI`NT~g<@!a1-V&hrx20^<_}MBY~B|O$psr5K6|KFeu*W)#`s!{ zmn4IQpAtD#4Q?N&e5Bc<=**FmrDd#;N7ix6IFd_{>y?n4fb+ zw+5J>gGHy`F+aZmdQuA1f#&ykARtX0WPa`&Mh`;_H9zNFi&LW!+S$O~p!0-GbDo!M zC)}9>T>mwFnH2{Prtz5dX5!@!NDpS_z5*z;^T z!qkJ*KPG626m39Q7AUqXOyJ#k_C&3A$jGz7Y8ZC#ZWFbRX%gV7Gq40Bu8U7fgV=!L z9Y54!5#LYi6lqFtf$5R_*-2W0FH`mhl{|dzB&~@rJ+M*)kDaW&@5{9LTgsTLx%pR< zwdxsT;be{h1*z2_SdE1x-PbW+8yURm6fMUGrc@h=@+AlWxwWQu`Q|CwgZ8qjR-dm$ z^H$Te=4E995fOaJG_6URfeq4@Aw2tV18hsAd6FrPkxQAFg$>b{AK3L!-g|o4xLY_~ z8}4hrGK&$A>v_M?>ftHF5srcY?85PuXOD@4H`qN8rf=@*^9*415oDGmMRGyM~ zUA*6o`;*{~U(+2A!@G#rVGhIxwo*J!%EYC*Te3WS!G~I+Y4xD9F;XX&;KgXw_K*eZ zf&DMXqi1MIIAX||p=H+(016TnEWDrem~_xy=u);Mmeu~-Gqi>w6W^uqg&*1`2G z9fs_M#w&mB+Y<%lcM=L%t3gOXwQpx?UBfmmO$43BC}VlkS=uzq=Z~{AmblvvFZh5K zB|@~>T2-7N_Mfe#mZM(zh(u;DoQ-w5@$FE$3&Bs#)~Xxpbm?X{Sf$$Ie{}uv4$|C5CLvKqkYRF#uan5n$9yfllaebwelfF*AZy~ zRI3|$B-lT!G`{6iEh&r+?Fc{|FIc0M z=V7a~hmmH0;XPJq=?Nzg%mkv_O+>`>2BEW9;Oh6w`RG+zXD0%U@g5heCh>^X+I{gm zv4fa56Y=fYXgMMUo8-}f3;Sgww(UVTS0Pb|3(vtKI#Mwt@#?Q(9)+( zYqZqLg*8B>LPZB>z&R>*OhI?3L8Hc{WjmR)4zJ^pYqhL`_fy0lC56wr2{Ol!@dWQzYqi9Xc`KZ#)}5bStEE&Ju$wYrc^0-+*q{&;QLvVEq3S9q zRQL^N#%d+nzq}vb41=16c+Es)E)p3?=z|GDy?lsFN(k-vm#LP1*c_N{HB>xX0M(IpYqdVE&k7cLZn*Ih5^W$C%nz95 z=(kh=&kg6luhY`PK1IkaY6J&QpJ{a)(fd$7$ST31@z$qdP+j_HOdsY}Poo<)D+buw z#)p5Vr5C(Mp`q>(f>;^CC<{jr^3!eJyRKuS$F1yv_()A}^<)x8g*A6Z7X3z8Mj|jA zrBQ_(N5NK)iSp5f;`OS(+!yo;Q<;N~C{y8eC9h43Z`%22a*tm|05&3@o}OobOqW7P zRp?froT0nJqaO?S1ps7?Ej1B5`U|amm`QwRd7Uq`Mh|QnTMp|=gn$&MuMKV0>4?Q9 zUzLS-x;m#2$fctaaXSS^EH?GCS$GUqtUutAa)hajfBJ>yjlw8!)q_qOk-V0l{z6Nq z=RnV`4pr$`sMK?yC1b~f8BQgx2jY)VS72!XE9P^c1rGHnRG=U6s_UmPLcG0jDgv(B z5PlIwh)+1wW5@=g)liy18k>4N4d~_TpzSCN=ot-l983$5NV6lQhkEmO>-&GBKBc^o zrg}PHIlUoi>V(54>B6R9=1v_+Rn4!Z^XUabQ{lXhcOw)1+Uak5Vqx7V1fLa+?%GZk z0Z6t+WnOuMmQJe(EJeX8>aYO@=`Q@hn9dao@T4DM6i@oeQP*`Oc^vKw7|6(V6pn$6 zF1r^HJW~~3k1zk5pzD{Cxxv@;zN4f?`*hODYsn~L*8C1-lR%5Im-FzIT;S8(_aCAc zJk6p}18o%rhq^bf?>s0q^fzj^7Hi=@HkU$^6wmR@?Fm0@kSJdmEu3pG- z!x7N(ygI-Fe?U8}xKO^MYs&=qu=ntGN#YY-?ZbodbPZtg{;i)%!1II+wrJHtpI6CL zYD3J{A+Q`MJG3A^aElg)^OK2Nv}eoX+yp!d@*Da{`qYsQWjOkr-j!P(M0v4)Kp4G>!BBu;F#JUSD`R04vR*R|K$ z;AS_%gVJ8!ToiApP#1m{uDeXOhY>2t?ftPfqx=!d@Hc;9Iw8S$xSNn-ix-p30eONcm}{`IlrP$@wZpO0+0mU+dHfE6(<(dQ>(Yn6utTfrfP7TE zxn}(G#XGbxmwn;#Pj+by?e4#k`XbIRM(~@vwK@P$^mR>dz`GW`zkyp$AO68Nno0*; zC%)0@24kWeDog}#KNKJBk6}mwOT{#$^PYROSo>v&1*BF3}fHgy@j4E{7S-=denyNk@jSZ-pEne=TEJsS=Qf)4UKh)mXI|yzG4rB(v*}(YwW3l`mi|<~PG5aH#u-EuIXsP^O zVf_8k_&au)Oy6nzE&N!1FE;)jH~#*XZkaQhK?)A{&srG;N{e93mxmkDVNO@TLUTuT4EkzU1B20{1Um`wqnYJRkX;_8chp z%6FPhl-u!pt!0X!+#noPf(xNvlGn)7{6*hu@8x~Eg}hLDN_2#ZK+=GXe;xVG9_Dui%zrcttsRM zr4YBLuAuKf^IeCv{FEbjnHOQ{(QAt6qO5Ud+C^Ze!wx=eb)We3ion{{?a7sGpe%}t zJZOjfjkliFH+S$3N3<89;;uac6?Ygvdqk@lM}EnIi6YXyE=hSUuX9wZ8&yMswZzQiB{pi zTpCc}j{wxzKNLSCqHh|BgrpKn2U^}q1&R=zc=Z~3BZt88ekZilYLpGl5(tOjI1Ew+ z76ndb)iX$kc!Is6A9zWqyi2eLK@zn_k)7P?fWk;|PI`}EJ~<)5%o^~QdUNQk1hWaV z4JrCw2etnP38rLK&|d-5_oM`K^F8ISfVp9S8S=jJS5Q3SN7#_m@z7-)Y&K9be-r$i4SwmjUM2>vV>H&x3mUC)t~!xUml<@Lq9q z(EwAtI_j@Xxcyhzn^PE+WEl6f!V`a%U_SiB@mD5%Ho)Lf3)RD7>k^Nt>nL=pv=f-j z2ClQi#B20{+rcg{UQ*gYXL-M9SvjL1iCVZB38uH_W>qK~4G?G_C!2`0yWnI7h+7!q zZNNNau%ObM>@LBWoUAk{-6fcp&dJFuO-gqO#w4ZE>*FrLnCqkTYQ0M^=4vg?wV+}C7XFIGtsdkrODmz%C0_^`{d_uIC z3{#ClH!gD=I6DGj@W8lW;*GwA3X0jzr5Ooclh~!Wh#kiz$nl?m*VagN~5c?F9SzJSww?-g>rcfViVmnUb@SSSgtB{bgu#Gl zL%-V*{bKZG1H^)RpQD27azy(+im-?}ciR``4+-V{?YPcy&)A)2KzaKk#ALZ=C^c`$ zzWnkd^!0m&^0@)!?S0YWKtqbhcZ-+DZpywKoDlLCsP2RT<^82W_uiM$|CHNJ;Er{- z11fvdx?3n^?^$;X#oV&QZgA%tG2_dN7#RiJV7ii`u%1|9dE<>jV>D&MMLx>6S<|^ z;@Kj}UwT~8(khE8fl|l2NGqe);lXk#TBepD~VN4&OGBT7|MpQ{O72l`)SIVG?%>cg6(h_XdbtCh|65CK+Ik z-H0$e5u|>9mtd-e%igSl6zboDQ>)!2n6(C&>tBXi#L&A2)4|Oe^#Mgt>(W$tTYZ9x z+@2x=S<}`N4nyz?U`>S=jTt{KX0OzY(^-~f#t*<8;}-!_t5A0789#%xGG@FmLgKhI zatsi+%=m4<#6(IkfqOA*wz4OG7EIZj@m+%{dpEvoFti<$1=+%nq#^q522}<_x)(4e zM-p>?XO2WgZcl$ceb$Bz&BvZ_{DfM>p0IJ3#hXgD+SPnouVqtqekK79*FRfH(+URd2iesL1VyAGrLEe_QtQ zyDFDo_b)^b14ktd2sC!nfI$86w}>-2VKDTc@vImaR+jv+*l4BOM%l_J{J{)J+}+wr z;J9vWW%`>@WwkPODF3P)ORTn4HWDZT&?&fOf=cfllwEp)b|bBf3F;IpSIZE{^nN`( zwVDCq78YCq;j`lUXPQ#IeIbXukVnGopD1&{w!{GB^y*2usa_%P%~c)vlME`k>n1j zq3qJAS&FnWP~%B18#M-qTTpWwFvSL#uUAC{$WeC*=Drl!n?Q43YPGurv&#SzXwSQA zFi)q--UOPz?i$QRfFY@l2Jv5{Ix6yK$!7az)5sD?H|DmoUl2hc;oQpbiH!X%-pcT& zT@8g#DQ%|#t&F^8$c~50XhkLeCJT980M9z@UgG^;sm_#LnTX1t5 zC_x^dIiNr~mK6q`O_HFY&f82kx=r`t%Uj5^+JQp~a@9SyiQKNq4~f23p=5&3Mfey> z#`;`@ccEl7(Sj&hf;=~A72<3B=J*0M0aS?3Ur|(Oh~jGq?%F1h5+lC0qGAH=C*o@t z8jK;XBfj1e&Eq&+d`&|=aWWvjt|E^*AoE573f%&hUnh`P5C=f=bGFEYaxW_Wv7JU? zel2<{L71Rr-dEodW=vdsG=oZ-xHvVKuBDsq(o5j29p@YU;IHYLxjFiCZ^N;>z&H9Y zHbMu@M4 z0w#`+#McSYwP>&LIbDpxoEbx!RF9`B@AGq+EI<46t?+iVUY;R0MR5%cVHJdB5mC8X zWU-3TN9ln^V5j&G+!;__oG6D^hDtY!o}`P9K{RA9AIrhg58QlndlJ3$@uI@QMN{E0lh zB1;K+)dRF~Wlz<{RpHN!O+n?CzJUQ24-S$;6dd#ViU^Ba`D{`qD8iJwcLe{iBFnVP z&L@}I{^4-EF5w;BAemRL#4^HZJWe1JSFY^sSUi8W67v)c7=%O_3O7tyPOku{Ay9)N zdXv_I;7{v8F=o^zatOpDPAIa<=!skWlGmG77-_hNf?qPN#7K)&>6c8~Xrx7{_*KbB z{K80#R_T{4xK;XVdc)PN6M0?^Yvw&-SI#7eh&q@lAjqW--Jhh)36-IUZSbrfmcuHx zpADyca*XVdi7PC#@y3EO15T_&QaFE}u{Rvyap%L6cLmg9BXR5ZboZGOS0Pc9JFqKS z%~s~~n>lPy_S&G#5P6$oBphKy%sp~jbOH1-CtVs0!CIMDnWY7xn(_zVTA9_W{BD#3 zvqv*X6E1G%h`Rtv5uz!2u>JrwXn%oHX+Mf~tUAI53AoShW$!xKeG#)PGaAD(DR zGUh8q-Kt>b#H*qn;S9WcBG1odiIG!MaMu?Ul&yS}?&j-SvRM9XE{lz&TM#y7c{&0e z`j+IdTvjzoQZ<-?a?<7QBHwF0n9C|A?3xTWY+6wiVhg7fCx9?q9!$w&k2kx>Kk2%h9VM6ASk0*mr})!2h* zt8#T#C25LirnUt-Mo1m%U7clzu7`6l7VJ#UtFw0Z&4?uuqD$t(^F(YLYc<@5z}mGb zM?uomJ1{rQD;O9?PizL?%4D9E&)zM+VIYa32IIsia%m#$>Y8{$4d0s2DixgiK1t~h zeuU0A)Gvl(jambufzoZt^kCoEJW5}L60#fN#a$99O5aSI+E6)GoK$y(u^k9jp&GbgU5@S-!}3H_9v+LF}Iv7=`%8Zi8WdmgU~f3u|F3e4ekV#Z-HrF}1Pa z7x9|4S)P3Z?_Qhb!wJ8rHmH}bkJM)E>2J+CtPMQp|5Jx0lUFil17C{gEZeE+`X0E;i&Xkwl2Vjcdan-H=vUWgwXuihHDqZq z${f6OV!ge^*L7`~jr&?P65A!Y;Ql?4cW=Pz$l~eI^~)}Nq%lk3j)ts?ESKrFTn94& ziZbIG3RpWDviSRU(<=eQK(Mtqg*#IOx=l~6V8+J98azdiCK8q0bF7>r=^B9E@vMWEVD{(2+!TBY@N zy4@{Eb#WxkKcSB9Pf+1(EO=Otqg5OKsu9b{E?pS2>@S=z3-dmWS+z`~Byk+9dxX^T z*ivtcvl_16SVDY?#`2?0P7T)PRAxkR^*^oCc)unrTihCVN+O%mgw?Z3FW_ys1JOqC zt;+|J(B~IvO`>%K$M3B=9tP9(NirBaCR;pn;7@ZXGeU7p4)zLAnLz*raHM0R+zMj@bOJqmDuSabfcLr zv13I*unks@@^726r#vswS1xGEin>5X^*8TadVzufz{5iN~JW15z4HnJFb<^&6(HUo4?VV)rzvLZlH~?ZO$?s zOPBIvC=x#D2BLj}1%mT*=*H4{uF4Xx-%}HfTd>rCCSGk(Rug+#uukE>P&C<6qj=DQHo>z! zVo53+vD1PMh$opM2#6cRLy@l?AP`!&`;R3lUFF7)Zx8NMu5O7D1A(+d+sIzp$P{We74TX~pW5 zO#wkx3P@_rnp-L0`A1o{oS7l5S*55;F0skdVhB}c^R=zn15xWC&EY!^$N+Won~!2= z6k7(w8zGttG+{Y~VmUqDhA}Iehje5fPQ)Vk2+4-TFbH`P&DgpxxqKpxflz8m6j4^k z&?G=u01F7k;@aTC8`qc=ETv2+owzvXBE>DjNTE>B&@)JUM2|f}$e^0a+93WyTb5=& z%7?aP8Td1=Er{Ae4m35^E+Pc}Z4@;qFe3K3n7nM!O)&_s&C#5?CI~}xTw7zJ^+QkkIC$xhe9QXCXVk>gh#8{((wGl*Y%W3<8$c@+aG~oae>-piAgG z>;$Ct<5z?-I2@}0|3q|i3>?kp6Y{YhFh2Uic=4yUkw|x{@!8zJX3%}g7E_&{ina4o zdzO;E!3BAbu;x;V)9IBK`622;?aO+QHMMu;Js)I`<(Y!PF4V56Yiuy1g^+FU9KN!Sn zLkJOiykv?5}HLNa{5Q#aBJVvT9C`rJ%ND z69j1$s9&E*Thbaxe?E_Sn5FiZP0CG~vmqO;Eo)v6#oz^cE$j>5`L{4NQ7l&`iv>RH zVfK`DY54ekRVxh8b4;Tw+UIdau*Nfba$^eKA)22g96q|1%S2{A6d5fHPf2NQ4sL_$trLA$qBY`{-%;z>dF<_HA+A(lftnvt} zkXFhrW2`}Nxgc=4-jB$=xO9Ve!GtBRCOVTWkrtPORBgL@VUV=!`FV5Eqb%MrJCv_$ z&D!1_KW_FI)N~OvB&BPH7t-92I$v5q6;uq^3;)c*+D;pU&sHhvwFJVf|8yE?*l!H zF#tW-tcc|sG6Su3QI7uSQLcv~V2F(RWLHNI5fe_Ggf@#+bCla3H&AJa;=-Ev{ok2K z$Pdz*NDPJ;2qXwT>~U5vFbs+ok=k@o*y3fv-HoY zn0~yJCAl#%IiDq&yE?I4Y(X_Tu>|`_-lh}FaIJ~)I{D4zEHMgVST@)&MCyF%=EzPg zuE5XeL`DwrN$fx{c{`N1V9P>)E1X#g^;kS^jXX?FZZGAaGZW?oL?IA{S1@fqB#~zM zHcTqSxly{YGBOWOLcjosbz9zmj7db6M=(@005*;t;1k}wGplB(#k7~7dis)XA=Q7HV$(?wWP;0Z!R#hY64NQn4tdrUD`)!U6qLdpI`grF@d8BEHFy z^))kLM_Js3JrQE4^jzu6;&S|W_FL@59rq+QeOH#3Nj5@I8t@1kA=(Kvy==>J zKhLK$Z<`=TGvZw+=R3Nx1fjqf5+8I-e!eSvG`#;wQ)nT@rB0@0*de4Zinv#PEzpH} zv%0Y=mcRlkq$msb;HSGWk9`MscV|tSKskg7Cj@#p7FjN6)v3IcX(R10P~M_dYME7F zkEm!sch)L=-$`H4w1;~_vpV0MC0ctKOuZ!05O@I9i0wHDz0B>ws*vWit|yC?0`-eM zux;(&qk6DHD*?)BfLTu1KQ8uQ9l{Tu@}UX6sMExPCMR`(!o^uSU?a5} z)^89_CPE}UL?Y2c{iuu>81<>=EgKrtUntmQqm=cilF+YV+P5GF^N#qM2KUNUis@Gn z{Ru!R4T{%&3JA1pHpKsvtX-#;(&&Fl%3{9jDX1bAbeDfRkRF8n;MRfiSDr3S55ZP? zSpGDtoJE9CY7{i*R<0K)p~P554Ax0XeZR=o$-MV7EH^`1S+JmhDq++BEMdvOH;wz_ zXILd@?fI|wjpM&P!@dg?J()S>|zkoyD6x%NoR9av_S55aYn_ zv65jy=7XOF%cq!q2Fu^_EXxQPHHx0ac#;45ENd0@RTd1swC$nwpW}GT=h(~Gbyqyc z+J=aOC)r{fG}iHX=860|i$;RL2-qlWd}?1%^Tg*_SnTXjH|#QyA;|_}G``|_wl9Pl zcLB)wUQDIN=nZL5g=p+lFZOWAOgq`o9K3jO?;8B2-fRwHbENcP8Sy1Ck`D#~eW(vh zS8(z`jo@-)Z?LcJS^Tv=Y)0%xNcm)${=-S^3>F*MTx<7bGXU`WzR*2N_|?9!*pBDX zduk>YxYXZZxl#5D5)bu)b0Z)r^$n3fZKOQ4p)cABsj0?54n^MZ=hD+mw6lW$3tXeH z5pZah9U)~1KO+2LM5aTfdmAW}>7?)>bTBy4&bPh58butzm19%96;{UV$MIs9j93gj z!a$7`Nx^tRO#?10h*`YDi!488_ZQLF-AK|?_C$dd4CX~IvhvQtkLO)qV!U9MlXh}q>r!l{)dSrK@sR-#Xct=4Wj&7?h3%H1FXVfXWp+zmaE#u~sT9d6|sth}_n z(~-=&y*L^1AIS&;+@G5nOpG>2Sp{69(D`pl6_V8DQr#3|(Z;vG!s20CJN^pu#4J$A zl7#W55r|+!n~eVlYlc93u!?(vumwOO`}aR^gj_g@=%*(Lfe4Mv%riq%M4N;%G0Aj$ zs6OecPPKL~FV1efHf0JKOM;2^;SXRVd>Ma~rHPp#Xfj0k0Ea}aASZ<=lbs|eQa!jy zTnoowCV!KL^j9P7@H3iqG)|VVsaNK^@l(jJ%7k?Dtk|KF1i8eto8x6CT2yhu+96&! zr;t0B$aw)v7SWIe<`v}>QA^5chfEt3c(h5Z}K{41@#BUQ5RKvgo9h+hM4MB4_Cx|tfD{Za8gb@d3 z%L^Hbzx6+?=KZ@Y2R#1YHf6UZ-T&LBd}B$+@1>#eI8guAHV!*ZMov-~DONg6q7)k9m zDVsRe$xFHVPS51n$x9JO)%dpnhwM%qrpN!At#=e|=KKGR6ZRv}1457(@*nJ?<9YS} zu%!A2T-d+Cm2$n{QM5J?N5`dpy9(it$S$%sf{yBhbPcjs##bfrT}V#_|6w@=16HFP z6~YP?6)6GGYEznIcg?{rn}Z+z5UOlPOElc(f)BPZGEVt3TF4#u({yx(C~{FOttkA$ z?^#ZTI@OQlDDYoUe43Y6e2rDG@8|7bV^s?X>GIHD9RG(CstxoT$N$1NAn^EKcmxC< z|BF{@{Kx-v`Y!|X0Xyn$d>RL%=s|5`2&Bejfv1_#xRNaCzGRYLl3!VhU#|?>s*0E{GK219}91O5^QJdN3c%&;Ab;&n$aDf~ey>cm+IEXXh5;}i?%1;L*f+eLXeR==4S&dv7a4n3ug;Ow8Qko)q zi=Tp%P%Jv)BV-Ra_%_R_=M!^C9>g7b^2!5R=$z+PUmQ}!MbylNy!!~2XVtt)hO&B= zlO{)V%r}OfqqB3LTUJqThp8E*vsXqnIg;FAZl@@+i;e7|Q?bSD0mGcOkX%&O=yT zaYiRZobG($5SA4(@F4kL_2e6niBN`r3}F@GXE~+PZ{R$ePP+c!^@g(YK)W_nwD`u* zK$|R4Mgz+lLU-vPUmApbD=L7$V5J$j@bV9Otd?TO4+#@x~n8V5F${ojXxfo9X>c$6Z3YM8KBhYr6L zH^~;ja@15Q4GyWIdzi!GGHO|^=?1Pw@CfJ3XhBsOY_PI;RHa&=|De?<)RO9 zPBIYxb0n;3rI1p=0+fbZHd1)?B9`L7iKqqL!uMwd@3<64=j%Bc8*74<1sEIK$befG zI|+$J!W{{R1Z}{4O><-3XjZMf-!r9+JX?b8B~X3FMgqw`m6xn!;e7dfEGqakf-1u) zYRh{pEu46|k{YBs+`RZb9HYxT98M9xx7b-t8KN~Hk@yuvY`7G`p1L-{tGavga}8>f=~CeLg%6%Joq`VjNBu z{HgnqD#5(M4_|3xn6b%AD#o&&uz@SPB6z>)_RE8gHHof^+pAcneMZ3-g^(t&@ZEQvDk z!^H0R<^-mP!n4a8s*XR&k4#{79G||;lP0qC@M{OLC(;r0cHVpyv=HbKyoeZUu=uo9AS0({VC{<|^%c#_qj`u`S%1)x=zKAfl zktAw|&SWdef0|8U39+)9P8ET=y`l6jFZ%V|6xODL zM95(qFd~gfPEwLO07)pS9Fpl>J$vU48NQqX9)>^7x(LJSu*g3KeQv7|&vDgiACqkrRR zEGzoS%rMhrnQ8Nc@!}md(}Lj60O`Bq$9-_p*D@{0B|0{58cT`U=aYW%zC)IKyo2`` z!E(dbi8or%Ps7`c{CRxBRqqd2YSUR{JF;QH8s0H-Ie0umluA-gAzSFoAUquLpri|Y z!S7yYJ>mE4dnlNDTHqz%bJJNJt9apaL6+voon3VUu#AC@V3kwm`8way16p>&g5a+^$8tJ}d zp2-mv|EN;wP7H99t zJvd(~FX0Qo6PB06fmh`dp*CM&QC{9y;3JkazH|WwOx-m!nR5$#nhm&Icb>nHWmeb( zEymw*F|{EywIRNa2chv-7qW`!){djw))}TUpDu*mP0Vmk0ZkEjCw3(GC1PG+`L@fI z?NELd&%wbSP0nnjvnsoBc?f+#;~pc4$crWwmi8b|7;x;tJvlOzf*nI(BA0mx`nVI~ z2TC>-E$zAFLtVzgcu1@X z;gRNF6XBLMK^}a6ZcR{!1J}fr#lpM5vL+rZh81=)|3@)vRf}d$xYBhOet5(<;>ZX^ z?(qJpfQz1G`TSDM9>(%%x`g#JmJi(v!+jXJeAX>tsjZFWBbG_ALQjrB*`O8ShzKRL zq8-?Y{VNJF_i06;s5IW1OBHQ-d5e!Qgqi%sk62BkK^GbX2!DgBxn4=NG+QFiLPC4M z+J%vxkhF~U0^C}$sYl1t((TTpmty`bOSk1xakGFlr68dx@sF3XtQ>MxB91#kfhrAZ z!J(aS%NGvnLfXd3xhdTTQ^^5{k?RvoT`k;fVT>fdd%qI91XiY z$hdiw?3DWRfG`{k+Ih@_ZIbw5hvwpg*0SpLOS_&CI|4am6IU1J#t8fsv=&$rPaU#` zm|&knf12eLWN)pgi9 zj~C%&)%Z8?NBFWRPZ3kXlq>4qtEmdNr#P^qQr}EB-3a9fFIvaqsvu7mBtJTQ$ZAwL zls;wNkIMms?^ws;A3cR70LpSLgce*6A)Fgi=$a^3#x2&*)jUFV7=&%V4CXK zpK<1{@P4N%#3$glZxFwo#2`qRc#8M@jJ=fgIqvMx>ZV>1{7~g{hw$xihheV-qd1bq z>p#;sJ5=0Yiog{$@8>Kb@_G2J8hF8_zSp*}#=P)z_GMuDm`$uYf9nfY7?{kJ^=wsO z5=vIXN>{jhGj6EhM=I~Ii8U2TJHCKmId}t$yQNBX{@n&vR7Ud5FUw5+`^M5;LAx6R z>(f~BxMMS$7nm-_a%wYsCoq|cU(4}7P>8)qy|x3Wha8BR8g5rOIVK6S{aPotH|iG0 zzj*PPgb?8f1z~FER@N-?vbZ-GC#2&&JZ&3GioE1cI{Xb+kyOr-G> zYt2g$H^IQ4;dMryAhBKq?ZIUJ)7LE1`VMN;ZYVl)_=7uHX2`+C z*rSxqTzR8S0)KZWYj{V9Ck=>y>}2i2OMXMsQqAf36(G*zeZFEbg2-c|BH}lqCv-AX#HOT#6>f!W~ zn*+hv`LLa=!5zo_!yPc`xD>}9+R40kiORVtx1Sux<+4CNx0}_f;&&DF-FL|WeYk3>g&QPzE}Y`t35e zDmIgBWvU(Dzg)IKa|F`xLMnalz7hf_A$+GPQ+fAqSd#*g{Lu`=BNvkc8-Yo?%6_V` z5?LY0GKn9lVzW^DPk>jrav=<5M0HxPmMX@lm@)DMc9D276x|akX<||1X~Y85k{!Oo z$_}Iqw`^tDEWAV_hGN3H7f=<=;mEE5(|8D!jvXAY5EYtD@pXIPqO+fWyN9)JxL+<> zQmueUbNcYsm2dhe1Hl^%VD$Q3&?_qDl6U!*J<-v(=t*_E69~aB5$4HPpV$vB$s&re za57fUf(WoKdB|Qiqkx2AgjySC5>*Y(bNU$lZ zVW397FO7av8Zmvd9Q~#=VU95B((l#w0^#{)&~gAWXvbY2LyJ{7UDvQli?c1@{X*Jg z#?mXeWo$BYkvQQS>(i*8;fuoXgF+E(XXn6pHM{@|NPg}eiBHvOd=)8>y@{_>AJ91%VUlkUrw7F&N{>0fReLF(k2$1?_)1nojUYjM z;rFbPb-Ot9J*yQm>V4cx1)(JGW8Fd~Z9>EgY-$DjaJGGrkKMdMPeIW}8e z8(xwn%_~A#9g6UV191E1FTom691BO5a0HYvmQP2usZ# zB-K4-pcrzb+$ z$n%e}*^gtsC|xxM2-nJRMZhvAQFKX8tP>bDe-VnX=I8>jQ&6jiG$=TJquapwZ`}I} zOV6;ZNtzB(nfx^bd7pIgk^`)or0)dYVNjoFUUDAx;y!%JoEFLar8DAp%vsjvUdcVl zrOq>LGYHkzGcE+ z{DH+sV!GgQPO}K@k{A8JvOLyBg4&@bVjOb0jODw3VAX@3S8ZM!FHY&><&{qgR5U#a zcF>0xCO#0)-#W>X@q5xq6FV*|GoY1o1*HWuAby3(GWnHc2F-tzIKkf}R}x`K{E9Pw z@%cZpr~(Yv31oqQO=LNNESH)_OUqdnvcT+e2w4t^tkShnH_2Mphb%%g>ShPjtrXZa zD#uwXJ57efyPskWYrlvCa$ymHpLeK`RafHi18_7;I(9Wk8`z|b&4O<~h4>1-5)P#Z z-rDNy>oV3f9FG^%ZTSD;!KYaZTDt8|OSIu{5-&W>BFkA>1C~HA>`+rq;~M@*$ufXD z44Bpk;QSsZR;hwk$i`=`NO}Y{qE{xa1^Lz~`VEu1sDTwm5**BRD3)d|Mg|36F)D=+ zF|g>{$m-r!z!WPEzw7|@Ely}7$ex6m0~|9e$@eSH_(dZoz99R&lE3j2+++mlrq!gW zm)SIt<}b4*ZCoOa_Auezicl5k053v)V}|Z z7?SIKJFFB(AQqNFOvnF1G3B9MKzv0h=*_*%Ul3X-&3)J|p1>Aoa1e9J1os>7^E>lY z`Yj|APAae~c<@Idk-njgq+ z2K&=DJmxBk4c`{-wL#%jzx`I_E+>?xv_Q5PT=VDE+2ML3$c0P&vZ zW3)7=!*Zl_T@)Vu7p8OjHCA2y zVM&;psPsaTovsAo4=E~kU<|%%Ha7wt{E~%T-(BRuJx^&naUd`!)EE)t6;W0CU1Q}_ zC*py_c+93vIS@p)81iX^>}*$l&Ej*eu?jUerINiV&jv-c9~vVB5C}W)cIDbEni=F% z*Bs61pSpCxnCmRP@gJi?VeB9^%YggS_(%|=k>FMX+Etxse^aWk1v!-={K@OA0-X`t z6rB&a4j*uXlK7(QEWTh6$V9#QLlUBn;>U@lxQ3DsbCaDc$HVRTyK_7)t7PNH=Gn;e zh&*^*h`c!m5@`+C)paFsGDECq{Dj@wpGTznHRahTFOXF6hG({|z}*fPOv!N=x2ee7j8V8nw!8_UE~a@FYtQD+vjJiBN$pVv@JURf6rIsrVp0=r>bI9_ zlv9c#)$MO3EB$d2r3?*6hKQ`V*VdbQg7(%rX+hc4Q9qLbp*w%+2FrS~3lh%Rl+Mru z=uHzlmBR?}XCK)JK3qt#(x3C#-Pw|Xc*wa%UYru6K&{@&?;D1%3$z zC*eO2_#hO6!ePz@f%Ba=SVDoM>CMsPu!3oL@6!-9Lh*er#%GNG^UQ2BSIE#1M8Gyo z`ZRHfffW{lzvBHls96H@#J&XhF*x*r&NKvPMZmaSElja11MQi1_1zRnKEv?WLq!qk zsNg0jZ~Mh^>WbClf|Sc)DKrD>7xeLFM2hUHIy^=ByrS`YM2fOCRjyK1{6<%1JFrGE z4YM5zLd}oH(J$_xTEp?f>aG?JJ`8Fofx(@uLi2Hh3z+kunquEDI!>=1MVM6IUN|*K zrO5T8JL=WzboOEbZv}^it4El0_6zLEn`(jSri<~vjmY)L|adD9=+d@;VFRfmx` zOnf^rj!s0F*BJiwY{d=C6pjLG;aJQs^OGn?E9yKuN# zVC0>gN}<)?Fut};i^CXSH@@~FFG_vQ_!@@1DD^+a*LviYQ~zyzjSSf;_d!0{q31bP zE#TW6dY#PSzDtT=x6mx}akL*y2S85s4Dbh~nrA!pOkad33UB*MFFdWz>_;3eqb&Z^otYuaX}q&wmcm+l5^0ACIi( zc++4#Glc()X;og}&j#yR@w4pi%n&uaxBAKh*j2t;fv7F8G*1cElY(D>bAzine<@f` z5ygV3*gvUQ(MnnDOt7A8e}M;w7=VP+$*WXi$39u2X^5UE07cq(NwA)nL+u5rL2XfH z5QxD%mjosi3{6-B;(96PviSHAy;j2Z#panB*buE4utH@8KNg}t5_cvXJm0Q#6JzI} z)7IIOw++>wvXABqLiIYh-Ek~b{{(J2lf!h6W5ohq5~jz8h=_$i#r`n;zFQI-hwE)A zabUPH)xs0>IZQQ7FgUs_J=F)p^<4Y=-0jxO`(~VCg7N#^dIF~OT(7pN{2y-par+g% z-L3b+j9-t?%ZpeMrdu?H_Vn@vE=={qk$R+c@*j}pa{%e~g~Ir2k$N@v)qHQHu#aM| zUKXk6gH{A)-datfXHVcy_*=qPooHpp5X6cDzQUsPJfbQWs4A#Tsv?JV7fL=ErPoDw zilTJt&a_@_WuK#+WPb4kwM`{c7znrDMQ1#JF{w`wkBrt|4kyZU(9ZrG9~`Zxf?9@s z-a4%&k%5m|BuliZ{rAyLb>Bg?2NiQ*)>5+tL7b1)Yb0J-LK=gZ+)4-pM24(beO_Xa$)!B)-nNRCcQQ5^g)aMrK9&d(?5y+a1eZt!Q4!MJY3 z$)I@Sll8v!j5feMMFSI?TU&_mwICuE_&luPkI+22Ph5Lc!Aiu2Wm5}FAc4Z>iq&wl z8G1DpalD-96r?O!M%gEI882xezCxtbfK5|JC#UF%;6w7Y|CVBfmC$Ypo&hpzTb;mQ4n&ew~8jdR35>;?VhNH zw)Xe~B@0@UCsNr9D?hH-4B}JM^|q0t?05}=nBkC6WjMc-4o)?QCuQgjAXPk)q32Qo zoDrG@hGyukGoW9HmhZKX86N#H>f=8=`hD@Dk5D>ro<#pd7q9TG9zCsofDGd$X)jd$ zZ6$6TVaLJ%$XAA>WmJJDV14jyToovZ;)Xgv<4fahfC*)?P~?tzK?PBLGN4$@Bxr2q|* zbVtJ#30?T>S$c)$vKsVeKqaEV3KfLe35|3T0YGqy&?)T{F4NLqHMjhAAq}p zp5Z>Vp8&wM2PmjhLBAi_|EeJ1kD+V{A8I0v^eXmF zd{-sCJHBe?=&HTb@_*()2(owPUp1+f%vV&_ABB(^QAJP5IiKaVlZq$=3=o#fxMd55 zNe;3!w{i_XR7HOfj&T#K=^BJk-INOnnV=pRDRFmwe$2&=-kLWeJEh2RntGVZ{fSD={p=( zviOJ9^$#3{zw@^FdSgf7h2;bD^+dbq@BfcZtVhDZeIy&N5Y35Z3(7v-vlN7O^(u*)z7p81Ag8+2pUWwz9oAHD(bR8OB}3L% zZ$iNK8M1_NZ0eAMVmaH@X*G#)1Q@dT(5CtW$={o9*C+^|7|=fjjw3d7wy6*)W18uW zqF^8*-z^x3AoR}XPd3w=L@gKhN0n|wP;lh66t8V9zIz_od-7qGc?t$d5TUDgCU~jM zxZW{9a8}5$yiRkyYTB_#fWy@Rn7@e0s7bxe2HXfKQl)Kb#8`;=WMUd*S32_#n!|Kq zZSCA#ez>{rv3KKkRo5GDiD;ybMDj2IY!RotMAhj!_S~C>J4mF58tn+ zN5a5#{48!8ipo6fem%HEFz79Jxr zjcEwl3S$o*6*R%DT}aOcnhpK|(^IU^+C!)SrKtyC$N{dD*Hkm*o6kfkOUj&&PKV|29 z>Mdz@f1|aYo_Q=%$ZzPFA~>^*y6t{UY@#wO!mWQ^{Yg!|q zwP>T~c#X0EY>0G1AixVx$8Ei%95%ay-{`7m@&eAokeIN}Tv>U{04e?V{PI5U?=wAZ}_-@FM&YhhsWIpybKWKgIb@EXeu!uW&K zbHjx!g*_M_7t9aX!sxfyIYbc=oeao0XOj^-AyQ!nnEtkyW|FuF4h_UZyE)Z`!M45r zPj#g;lT)T>3Gr7+jh zKWL}J9>j~5^rj$-%O2FTEBSjt1H(OCY6+C)K(k6=wtOXT;)pR1>B-&=cGy@!BdT~1 z37nf`ZLC(5!(@)BZyZuHf%Iq`yZNLmRep)lR3fbeYHu zgPTOsi0(e&useCL``cCvp>P63IIlmfXVfY^1|mU;<2U6}5|j=I0pp3|#~#*Wm7^6i z>C#U?2p=;osxnUxoX%B<7F+a-yA&_OQ;40|8dy&j`?v@(HU zbWK_gY^u>Yez}8Q884iAJ3?gc%^P&ov#VN0M3pkherSek^^XZl?@UELsH2|l!}&XM zb%7{+1R+E-LWy5Aqc4bN-*wb$phfp1dUlo4Es6@{c?(Llw1_*|{E0_&L}(Dp8INR7 zkyOZwu0NB)r#}MWx;Ovo5j`usNU?s9m8N5v#ebdP#|>C@}psuUVcQvw6;m{P7UsH)W3*+wAXlV0MAub300|%wa-d!F%{=8Et zi0Z0!wA%573Xu0{0?hR+FlkelZIGCB6Ds5JScP7%)D^ruO>d5u|6b6rFZ@jaqCsvT zxv;E`FVsL#-S`GgUnABFvCyGRZ|Yd_HQ&PY*TM(wh9ykkiFefXgb-uK_zSvTCuav) zy`deLJ%u)_eh(9hWH}~vDdYJTU2mCkd@ck>l50zDlq1`rCn!}pM`1gf^J`ODXYmIg zhtvrM@$%z(Qy8?0ABSD*alYqq$nRbF!zaA7;+zQHGWE;W$-K@JdR&*Ks4b&h*dXPN z9Sb#`)N{JF@1+N71ak;gx;b!~K0>fz*qw2{4if;l2YTXAw_c?Pa6LUXZ!lqtIE@!} z9tz1l^9fxK`SOzp4Cgt1`bTK>U}rra5Tm>3FNI8zhW5aYPwOH&zPgK^6J>$X2O!RO z(fa|!GhKDPQV}>OZ3gCxopN0eK?bY~eypqhc=mDe(g(D}9LM8ySnd)LduRuwjfYZ| zfxKHcJv#?m6qqMm`uhL=E3Bk~1J=Jl0)*sL9^qsnAM=6~iD30n|#xE+K*Z zFZRAWKB{8vf6v+UP1%qHQb^bhq4y$46HcTm7A*J7M3kbU1}qfoMG`s)3JCJhn@F#M zHxxxsKv1e;0~AD1tP~YcP=4QM&TjT>vhn8L`+DE^kKgrv*qoU;bEZ7=^ye9dV$dZ8 z#`rpq=P(`XX|}EL(@RYF1M34q3%pT!eLD0q?`&aPA7~Lntk1PR;-N#?1cNAxW_+MF z&?MNSFbeAvfI4QX-WU#uac_isJ%^WO>xR1Uv!z(vyA6DlwlQVP6j%#sM_1kC~l*f-e$a*c|}v20H!3gGW}E9;Tyx%=Bh2 zZ-!5d@8o{sVdaS*kHfeCn-I6fS0dcAIf*p9k*e`vsO|%1nmmeh^q8I12uBp!4t)5t z47JSo)*&#jY>8pRt|BTHf;i;C2~cmMEA$cgBKO8+H0J@IB;d!z={9Br{tt>K^K@d} z&r`yKW))1o!GmV1pLbQ9l|=w~FrcfU@9KOVGEzl?`q zYTBPcZ+5_qQWH0I2#>o*c})3)H1+AU0CU4$SIji1Pk&gQCO%}=^9``9R(le-m6zQ4 zFyfQ|u9o>`t#H`Cfcmts`;)7z#r3vv25bDRu+wFyBk??R=SIyvPjjuIa|@6kWmUeJ zb$`i&@Fxt9eNijpgn(M|hC*07$zeqb-={JX@NK6LWKx0b8}&7tWb$>Zj8okp(SGcR z_Z&v$zV1~tw6B?3ZB`5)HS`+5y*`&GMmtk1UWc~yHJdxv|Gbng^)+)^%~@3mdXRke z8Z?FK*Z2sT>B9k#d_F)WkhcZHGs4*&c8;#nvG8AH_A_fED_o@C{UIB6E9xKLu`;sQ zM1rwc+s`aUm#xhz1|C_+j&U_j=Gj3|7*e}de+{j^kjpRofBaNrj zE@EIfVcC!vfQ0b=xC+_fflhJl0<$-KR;`>JI9>c&xcg9Mb#=R71c2xF6_%&3`zilP zpGCVLHM0tK{kSfymaeYo&|%i$G*HvH$cd|pc}ceVA8O)Zga5&Uhc*5OgkBp<{11qq zHs<*sm5Bve8X@_Yl4VdinjCA8TBi$R+vE;#fBRyKK#vhF|&f{DBdi?tyWR+^r7xATkDlyp7Ht{r?r+v= za3Ya&JHcYe%qQHY2N_i!H)8we1Ay6^>cDg>KLopxVRes@cL2D@6V!143_#1M{{Z-F zEu$?1%x?A9F|7ug$HA&xoFxgCExZRa6l-U0QL$ls8y3je5}Ak5PEjTmI!68Sprl#D=S_d#Y} z=9u-dxz;GZ0owqJ5?dys7aM>ejQfK@W*2Q8Wj=1+)-|{#Gg7vezB|a&EC6k1VIRrx z&z`NHXpFkL{-UDIkHdjU+e_7-#0R$1V^5mBTF!8~yy5PF3a0>kQ+YG^RdDz#a<#$k zLD>jgSEbf1AW$g*7}!&YTu+&;wByw2DYH(&fvLwFyb&y|MRni=cH!=GF`QGco}+0T z3?0^LV>nTk`}LZw)0jU4{9k%macVw8Tj4fUp6EbFnsL->m8c=M%b16T>L0x4(fcy9 zv7L+X&kfuch_zy;j6=S+02ltwd2`X%dlB*<3HZ#xTDcZ#imuc$$trKPy}pXYM#?y zr@3dxD1Sz^3t^Vdk6i)6a$|usHau(As5pUbO}guSO>^>%OpKL{(F^I9XU)cG2gZM{ zAQX$@{}TxyjAclCI|MEi{xZgN&QLbHZzM2b3|=wc)tDTEKm2uc}hw$@&t+lIoZJ)HhN)bzS$C$QoM zngsVBw0I~S|F+QQL)C|V9SZ%xm~E6b%&b{)i-v7stj%zyB+xMI5p^GCR!>J2nMT&pkr+V zt1ug=WEX=~@sRyUgV%!pE4phCZUknl;k4q=y@k;0d6tg$Mv5=Kcc- znj$c-&ST97C=cBJZIk3Y3mEP#smr*744u94{xu- zJt8N#MB|cuPG@+5HduQWlhzn}@CO;m4J$hMoLN;XIHrZzb!O5XLA&m>@46#+*Bxc; zI`o;Pad|Kd9(Z?=z}1;Q4i4^{w5Lodk|sF2T_^~29IX{5Cs z^OCSZ^PYz)XCS?fpO`_}I1LOQ@6i{}o4qUiBYlA-1#0E{Ameb$*qtw!Ipv*j z5cMkWgpniYpG~;BHDP;8mupA3?ktEJY}*~`HpRSNtwMx<6^?ILtFU;2*&d7Wz4g;* zqI!D5`q@0u9QnUJLEnz@1ZnpqGeh5(NOk9!mH#h|Yut-wM#8WtFNhjL7|0QD;}tSf z<3{B`yUmWq3Xl%J2;cu@^y`ZlereoT`jq@tKm(Xj?rA|#gVU@?WO)Xr|2xMQnu`E5 zU+3q=g3qr7&Gwcq*X&4VL_x&h@MlB9bF?3xhfW0fn^kmpis{s`$e&Mz57shDBZx!G z6#ol@Oe@U|#HvFc2}PX#stxD}6bX^B1kVFB6}0}Y^%!@7HpDi|G9U`Fs2`%d(-5(+ zjBcLx{~^lr&mfA%OgHP-8y00{VrC{8ISe^XGt*mR*IU!Vm7ip8DtLHhf!p;KeL3AU zBEOx^(Jxo1&J43r%-)SiKEp1ISE$bnv%T*bV*M3bKf`Pgv;F`?LvY%7{$YmM1CrHE zGtIPu6}#B{egzbT(}>HdY|1Ev;^^+i}q8axYzo_TL1K}ocY4$m_G z7W4H`=m@NZX*t_$Q1CSb*u0r#odU^>w_pPtEu4>+RY@R3HJ%YYjVm5|2TzM&^li}2E zshJ)#I|29?8WKpu_br7wa0^X9G05mLG-7FZ|5CF>V-{n5xEgw&G=w-JSOzi6?BNUH z(XwqbT#QU%>o&`gEti>(L!?`?%={5QbC;W6;(QKYVGf5>8M)FgRW_yRE6rqlZvM_D z$zCf5n$qjAsoy?TpQQQaO33C)(u7u|gsACVg~eJ%9aou6 zHor(YjGJba+5%ihSLi#!kpf{L&0hn|IEda_V^*z%z$2(`a379J%a6>6gOEQ1-o#hd zK-@h=71x?Q>JC5cLY@O;7{Eqn;{romfdHWL#w*er=?&*Nka$+hLxD!~*P6))sOM;n zeB^ag_jL%`vDVxLxO?GMz}KCnKzsE1IlB4 zhL=i(&|`6ffWm)3uZLR8rXIVbDYgaJ7TQq|T4+1jrF-mpvrpttODr6CVSOna$S73d zz|ttxjsx`o4%9-fot0SJK8qk3A*@)$SH7m6u(D))JL_M(c92V;>9#Ec;|_aE987>F zjv${9MZGz@sYg>e##O0nU8EiZ?z(DG%YT@+J0sa#8UeB}Wutjt%7h#hIpo1dpm$~U zhvuGu^!%`PAEVZr0C2}>?j~~~e%fz_OUE+$$7bkorqZ#^<^*tfkG_s`KZ8!a4u!*Z zYW@aZm_ak%KxFuK`r-|I3Z#mVWm#mq8-G`^sn_^e8??aW{Zg(Duv-ukrU z@F{R-V@EMM*n9vD;4N3unk_(FFVT@LX5)e>IeZMlU5DYO2XJ>!%|R<%-R)%hix{K7 zLdR|c_xk@D<)YbFV=Jjssc20|X!@VkK8H{~r`QiwvG$qn-)deTv*Am2sRBp8kzU3_)h>W-DXyaS3W&_RSeEO?iBiH zn|XWYVWbO%&DQC0)Y4;fJ!9Dj=P;(8V%_IP>iCvG(?r8Cjlpn+?Lpxb0~s?Nvf{_x~28G>=K6}fotn-a@m$#co^@-omr#oQo z!f*6W{LcH4TI@70bA7XS%n!LdZkJWxhJWY%SoH8NkVI}Ue7E@?H@Nj(t3e_EqQRPX z!A!vB`_+5quB6q65}}228o1yFaUIAn?9MORw#W49iC?dd_1C~*1LgG7KJ(-FolD~y zI2^4U7_G5uDSfiv^u&+47++jA<|0KLK-sW;vBhO0_EFOV=2P0VqLl~CH?*Xszr~06g?a52W@Z;|9ibsT|S z*E(IDLb38q;X=5z~`2 zdQ!B1;nZ$n;fkac4p4EEwF|$&w(|cly=l<=UnBeK4`LN>V4UU&uDv6@xt#hosD?QFuUzkO; z*P%L!cL!271{~qu!3j3m{1|0?T|Cw(jFl>%Ff)@j`nm&vVcJdxFzSj58xVlyyjb+) z3G*6f(xxRyIl+4wSfrviPhp>;KlFc>s(fwMNWwf-Lj_?B9dSC{deU4<`e}1r(z#>S z5mepqVB<8aw*NQgx|BnEZM8T>T<@UcC(NZqC%!e~G;IT&{SLHk17&<~rnTJ=9v8#+ zOyaC}j*Ia`VSSBLCy|d!?WY^n(XlbU>S(L_o1Lgu@B)9of#0jX=AbWhx#4@$6XRPv z9knOEhw}->$7_ka)f*_`2eVFVbQ;OWbK*B}3RKgJL<3ZZ$3@_#7*JKD2u3Dlb6>?CUoy78G1H3p0Q} z{JkQvQG_~uYP;14xTWzi_Cr-5{MOflLISD>r-3ubJ@jN0;QJC6sP}aa&{gep2ARN@ ztbO!1Q{DusnP%XWmT1Nc#>+MNN3&)OW~povle%z+s@G zJ5@Pn$`CViV1I%QTtQ~d^4fdsW=&Apuwn){NO*{KKugZ_pPLss&m-GVh#{4>v_{%h zh2^!hMuyT9S~n%y_;D`}$KDhdC@NOM>2a;h)ke7o6|MTobcPyd>7@%AXL*;-{_)Vu z#;c~TU*x8A?JwrFY3yWF$otJ&Ds14^^T)7@8oXJ?{(`In@6&6)m`zfPodIHOz5<9` zpL)UU9?(%mv5xAY3+C_;dr^9h;r6{K?;OMJdx4zfq34;*6U7N8kDd5+r;G+37 zvsb@eG@sO_7Y(=s|5|3VhW~0d8WBw_G+;L#$G1@jJ@CN~Of_GNkV)`zrZ$+odE(1qs}g?!IE)%qz3<3a<=R``z4e zI~xR$DT19Va@Sh`5-0(nAiW^4L3UW~*22OsE=<%et9C5%l!f}A1zv=xNo%ZMyk$HHaS{+ z53_w?jHrm4lPE^qn>r9Q9ajM;fW=|RfHH}lvzAi@mso&&DX+Q2-=euuw8w?g^M;lSp__ovAHj;U9W*&X?8KPz+~QVTdAHmx zn&SS+<8Cn~Y9P3~TsKr=k0pu;`u-ebvJwMg0B8)Duv5{q6-18JDhy9cD+rJER1;4J zD~Q(CQ!<`XlEm%N+@Ht6I=22v!V}pYqd=}hnwBKGMh=YAb8}GhU6SY#nTHWNaCt(v zWKqliP&71IXj;Yx(4x72jA3O2rwR>Y;ZQxnQ(|_CNYh_mKpRp-wswe)AXkj`Azerj z^+TNZ(pa&a#;kwGmZi?SGG;BWCNwK(6()k*sj{(3JtW0ttMJ(3#d~yaT;wJRu^mV^F?)l z_!x?+A#TxrAW=hf#M9gwVmW?ptf>YNUQ6VcYoGpe=EjeggBTkoT($Xh*!du~k^|6U znQi4$6Yd_L!hg7DQEF{r6y#yM;DiixJwE}OdDde094G8I=OJ%vDl?K0mXIc${ z1{<0p+xaz$tb>)$qnqmpQ*BwCClOn=styi}po4XQf5*^;I^qrdtgkBuVXtb{6D_KY z(LLe$E1Emu$mP*$IdAnu)pAC`^Y~WZS`4ixX5*DA_0`WC^+omg@hPkq0La3b&l5&Q zZISBY)nbtqt3}BTL@q{RHekeng|e{Sx&~?_A2kqJAz-02js9~Lc^Nd?&X||IX6no; z75U#Ait1@&^p%)DlmftEx(c;c5CK5g)KJ_3(?CKaQ5$Q}vJtS(D!Q|gcudX9Iu!dF ziF`hLEgOs8{5z+yn&-C0z_u6ZLSu0wZwJ&_5!j9!nusRoX-E@M2S3Z2h-v&v`=;s$ z^=&Hdb0>^0(A{B*cR+!JEKN<&$YUc9`lpIzB)UofB~8ygNXd%bUQg z`5wfsxq+Yr8LdSPK>I_jv4G=fVQVot84mSOL#BEY`6rnpO>vFPV4QI&(=x_}^(N=W8wRo?$6*u4~vYnU^$MuTjqrqCF_Yr4NGsO@$ z;pc=Qp1_aHRm~UXie}oYbR<^{#g(FWUoSqY_@d^zqH7UsWOC@1aLi0bm-gZs{loXE zu)Vk^z&=JZBl}%@Q6-9h9ykF1L=!wn&uDt8oB z1G7=?3G9pD95E${&doDDCF=VBDAJstz7rd&?(>eKS)jS{UGR1Soqdz`b`sS)L+Osd z2<2zZSfS%`$E5IdGFLrztQsQK>M)T*<% z)@2niLq3~^bQTrsVv^1DTdi)oqOE%FY<0rE*Zw}hlh3BDokezCOhaXq;t$uw8|oQ> zLHt<{PPG3G9Q@f7-$fXa>Z5r0TNiOV8MjD^0t|Gr4}Hh zh11xV&nq~{aiYAaF{Jege1$@d)rs!m&xf>rjgf1()8cx=iVJs42)j^N=HwW$$Z&IJGI8hJL z?5={Zf7{>n26XQfA;?$eO zSZ#cf=Vnn;bL}6K=-c|Rt*En;SqotL;N1I5=W z5SjO~nLY?VfU(C=HBZYo3Uy=Shb+yV<#zPUt>W4WoR-f6|2FU%tlvC+VF7KwRZIbw zAiIew;j6=9E4k>NZX%7Qb`$wAd0@06^C1qbrkLBrT@Vz&I^&_=ZK6&1-P!S;L~69T zb0ykwn;09O2mW<5-F~~s?hNU|xT^Ix3WtE+hGh&uNM&pVC@RpIap0nLFNLF%3gs%) z`a{ui{KA587@eR(KWqI3n*hq_joU?+^gQ+fTH)kQ;Ps(80fWOGk>?K4tf0{9aR7(! zs7p3<)Q+(VGdvNhTyN<>!d8?|3@&$~92}Qgv1}HJY#)n-CKxe#l^Ma>zsi>lWaMMi z^UznU26Zj|pu=~FtO{#X2@kR&H`t2um^;Ow=;B^!^qt}ktYgk*_c=G6xKoUb$n#X= zzaRdas220)_*jeuN4Gc4`WwV?>zT#w-n9E~qJ4#t6FAENPHJyJJM4_^<5a~I8NL@G zaQCM6rsx#a+h04`1c<#%nF1o{%XCse_IQYzOHm8J+DnS-0HpJz$cbIWu_rJK0^(ND z0Vy8Q##7roG3^=#%LrpDFj8+rvrJJ~3_uT(ewvV8s__xt6{!QTv#$me1r`YI2WgfSkeBB4WT$Bw2$h zR1^F=suc)CKsn75eC;0at9R2E_lUYN3~FAdI>MEDh)r4%<@FJnbf$-h17rAm578vG zJI6=C=hdws6s>Xk6-;*SiTyuE1A2jJ9+@DnpU| zSXt$eSy1jfR+QUI)QnRn8K**>WO}lf`q2Dd;sJawx;Ge;^4=k{b9 zvHeuIWCuI|MwIMsI1yqBJ4^3JMZIdDA-fos1Oh=_C}xz811H>w@FeAXBb;o7V`qo; zkBX|9yAfx>Dr(@ohAKZ6GpwvUD`f3ikH_%k?o{D1(O#**0;Or)o9UgI5kNLbSnyc; z1D*^*$`pF(G4Xe#hf3@(GL3`m3JA*H8A>6}?E%b#QFV6P%dPQQDYemv$768(GmeG( zWqP!~cu?C#pY#{?U0|@#9d3((f-P}?F!WztbjJWOOiZ1eiVD_qYVLo;DT(MlZ;B37 z3b!@jN*(Uo-Z0EO#afL{Se-C$yazW8xhF+UJ>xO3Lk`{Jci~B607lZ^WzY?^J&=Q ztQw=PPl$iu$N8k_p2NC{XirVnvcmABdulHB0;hZ7Ndbee2X{=c!DjfA;#s_)JtZdN z=cT7apBik1@Vy7eb*J^7li!Q*MCXIe!K+btHT!8%6<_Z7v>54S`PXHAOGWVFTX3E8 z!T`-*;}3oRbUD{B`rlc@=rYz&3tB@Jykl>Q;lY9x!YQfr*1G1PLR0vHv2@ zJq}`7?u&K_qwFy$#TGZE4+cYP{0=2Q3(EHy^?p`lhZtLF7w(|3IfKXM{GS?|Ylx_i zLA4wL0cH&K8zRy}jIFepIVds%td~7bzs!K%kfELG1lnDqyD)&+o3iDB@hf6(6p93= z4jmJY0uHS1-p?V+oYSY~#MbpYVa=g`efg7T*8ukMiJc8SB(K~A|-u8iu z^%*d4oUrQ?$kq75)KQ{&_?)le-P`H?QKDV!+su7{fdLtQnX*QUii&k%?1(Ww$eCv% z726Qya<;>lxe(q)J4ucfnF$x1-dfDJ0GvFv+_GEEO-l}z&Bkima305gz_&WRVaOEgOt+cJ+#3}>E2d^8Gn-n z=77(-nlI)LUI-^zXLl|8o59r@dr0yE`Cf>N!s20dBe6N#sLpdDCvD#;EIh6igX99I zDJWu+-ERXrV#BE6b0V1rKPO~5r#Jp>5pIn&v>W)6Iw%|ttcie9c_W>94ruK>WsMV= zUOOKRG*ZMjB|yoL46x!jUiT^LK2CH->l))lX46uwF)p@BvGyB|w(hAZC{RX1^^9yg z?w9DoIMLA80Tg5%#*6xq(3sT(W}-&pp#-{0FN_DjUKGc-h~@w)!Qooxz*Cclg!pxl zo{X-Qhr91nR@c9e7nL8df3$|0L+L@JsA+jLPjLgS#Ha($s%w4$s1q}D!_xVy3ou{! zyvWYlssNprp7*FGU|vlg0rB|qd$jd=(NnuX-WTw*jE21c!^kq){DQcmaA}0c4Gg<= zg2-d5L*V`j|8%^}PVPoR~PL_K!A4hzXqlt!mP zmgMph?~qZE0dTH{Df>-%_NKr(SO}08+%SYgJ>*5WJ##E7_6{qJwEv6^I2MRv zr-;gIYOg&-yoGiAVT!m9>j<9$wT^i&!3HMi@t4G`;I&Vo22({is;-#|nLlB&Qt0eV>W>kGkyhVv;4 zii!*3i>=H;ig#glFT5<4%FgUs>>lz%AYm|Lej5hlvt(}yS)!)i)C=On=nXQT8}qz6 z8;aIb)MKs^^S8`lVVRE3!7iO5%_^)j7cx@GCX45)CVQ+V7v{o+-v?{}kfd%kbCK4Pp6pKAzCnMQYBpZ&HlmKcsjf zfId@|fc*B6EKek!lEH$lyp(}}6-r$I6Y@a1Yk_DR`Q|$u;XD_YrUAO&rVkc~x;U{a zk+$!$HkG?rB`U;~%9*0$9*yb_6t^!fJW7F*5qg4c=w@n#4>`8 zMYA=;ZM+Ed6RngGH2xK+4L+b(UxDY=Lv;4DhtufH&U+)N;mtR=pda=uf_1qMJ-SF# zirBs<)_ov{#xH_T*oU-YQAm%U(u`)1_dt0S4dwG501EKA08{V9;@+4s%PV0ifOBTk z{>5-AJFA{SU1rne#Udwh8iM3B_v~m`RGIX-Kcq%)^ymx*<8>X}!Ni;CJT7hUy=2RX!yHv*X47i8u>m_u_{ zidLxz_2;3Yk`3fcQIP_m0J-1JuN04gg5J9-q-#NG92UgIl^2KEd9kvAPKm6_wV?BA z3~D=VTrGM=a=tiDW9C^SDrTvmHZV>gSBAQk%W&L)@Jm(#v*P5AHKMKleh$5~Mzjne zgp{V?K|*eMY52b?fMYh*5T_o3MEv)FwKgAjKd|~W8k_;Gb8rSU_Rh&z^XN!{ zh9rW>XAE~`obIEPuuf$54Dng8SkS971{jI&xy|B_Y5tMH65#6;`q*p?2y8G&C=Z2) z$Dd)H18&WpK;zbldQp65pa)(MSM_Z*MiVb{}A<}Uq{f18$M^7saBCF)YmMe?V4qNZcIabe4AE z2%>Q1wbk3%=3-n^3W^l2QNEhnH^4b%W>LaMF+j^;|7s^Ma82-lP8G%iLZyrdG;5Q{ z;y`qj4FWDPY_nn>EH)pR@(*qj)e=>7yuT2P`sWn6S+s?Eq0?s3T>l`43O9>32{Tfh zaN_pA`Z?{{EY6i{If9T?d6y$3vMRM47A}Rt8aLvI}z2DKBNVJ8l;5FEdb} zya9!P+F#|C^Ya#XfX$%>Z;ChcQQy*!Z(?vhkC9kEO70LBS=?1=F#I1~_gJhM=YN>A zRpe&md83pG2^n5e9ux-VIejs>=d5j*lOVZG zo7L`1xWp54CB26^DjUi!~ExvW_PE5Ag_n6PZF+wu|hFixNESGL5VF&}tl1ZDmA|2n$&$qT*6PaU1CUx(_9+(gM`8I0>53tD~8xoz@LD{3&Tt~;|0G# zjdp{(o>>(TBT5Zu}fL@xa*<)2*8ijZC$70ZntL z)4QTkqPqN-k3K444L+1ZW8a0Lx`=Y#gZc?+wBHj(t&x|Lfi;bD-^R0&YwY*&AWO#g zzjEGqc;g_Tr}B+)j&zjJfeY8BB+i>@rBHVHQwGzi_aF}(BiA006O@UE>EtuYew%Hb zP&-_uLfd}V9#JC!#$^k0g)v&5MU(c3qzAq}gWOvDAJXe6Uq)7ba$ zDr2{9WAs^DQ`poI)?tx+ReQnK5nRqnyg;tKqFT_H;hBIjgXci%6$O{}F-Kv{-S>*h znUgoT{j*mQkq+bXCWOTI_?f{@aUxz^wvCNYOgzA$Q;_I$1R8 zp!h}abo>hf)dbLKnYTCgh~=s z5l~X|BhkL>gN2*6aj;74enF{&1?~{>L*?_43{rxWm(d8)fp~4~yK<5Y@{v?ZkQ+V* zjW|a4e+*^9%%bHVBj&2<%j45kn(_iSrzvNK);Kd=T}A`#i#pMOOk>6?6``Y>hkq*> zQ(vKsPsJ_lAzIa+19#-7@V7rtn?6nI%H<`nfmD*8r-0L%X+A@$yqVnLa3DGV11Lr$Ge&qRsIMF-?;ksj06amXPlM*>(UQ|5s}7@slI_$t zot_+glZT7%fjs~!IComyc8l$E7?1Ti>>9q#kD!^(QZrD@uCJCS0#=4QO;Vk{_zmDK zkKXx4cv|>-;eZ70#gC#ec7&!f3~?{0wT7m8iBnk0^DUw#$Z(cTVTAT0x45vkx8>fL;bNab> zKx;AD!6F3*%Ln21^5V20+-}Ed?2R2D=FFQby;YANL?z&~Cw~yP1*|UqJcQY0IrFO^ zfTb@+hH~^*K>+)IafYfx5I~x9=Ptw>%{S8n-}6TU^ywB2%;r9VD~Vi{7zKfas^>V1 zbY+GE`V99MIWE^?T@T}oRWM!h4IVjoL7jepx5Iq`mbhkmSBo}t!D3o}M%2-_ETJ#X zK-<4=1tp!u?~bL^;jE~wtNp0p_J>q^Ram0E(`r8&?F(!l*sWgRQuZ9Me*laR4`@vA z2llG=s<1@+aI5{;;PzJks<60y0VDBxjtJ|8=Yn52tUjO$i(jzXM_TR21-IV;PEMtTo znZWt#MOb#W{32?xK@H+_Pd${v`oG{N*4&0y0d{u%6|gKbYfT}#CtD&%a&GL9+}Od{ ztX7>igUx}X*JXgHEM(O6O+-cirNM>adG6Ab>k5#N!yEaTVWHUqJ<6hmZYD zG|+yg*1w4~BtX3Oz{CXsy4=9bWwc{x5vUslgrZ^?xjl^hV@5yr~NNqlaB^pPpaT{|Xdj$gaBOcTD39eeye!GZfJ; zzl&PFqXW&@MymM-A~)eZ0$o^$P5&>P8!S`;n>S$SVbr2rKM(&QD%Vy^1qHv8#a)~M zrx!6@;Kc#?b(xp6jsSc<#*ybLbm4o8`d$^dG|c8~4qXN0G2mC$jVa%$_Ry`Z)a6Z` z)a4ccAWpKYZ1BiygkSenWREDs|DuN93IGc?V1jSWe3Er~b)U*08EVhmC|vqPhEuZ2 z;9jS!29O!+lo@q!SBw&@m?iPUsSO5%BaN@Z&s|i~J*0lI!^136EXzNqG z!|3sFd6%}B4u;Dam7ok~uPhJSN}{36kG8M`4U3RHz-yd{kf#214z-GuwHOhASrJ%UdsG(_Sk-=ZaC=3-i`y4y2I_q;IIR!N34Y-nrhmmRXa=f%?Zd40 zbA#KL91yB~?Zd71^8)SLxWTX3`kpt78b!-wAgrQJ(K1fcH!q;S#mFl9mpSxgj0{%k z0og#XQ6?a32kiiv2s*GU1`AC18Vgdz9LzRF&sDMi%f9jX7I>O^qj-TW216B=Xs=uI znI7EU;yP6!+85ZlNZ$g_2!3I|8jvb1@d4igGmI$V(b{o~>r{m$+WQumA;jOl0DQB> zgQ?OIFGN@~U=Z=Yfc6%TrwU87hifK-AVY|)y@C*{utfW)?0eM<3?jA{tO2RQ5-&iP z$sb@4@wIQm9IblxHw|!8I;bQL3LTA=%NSI~#L1e;KSLOZa{y%k1JBc-jbkea2wtVI zTpbkeSe&eyZif_L!G<9TUggS+VnJ!`t&1~)(|~wcKSl#_0wR+Q zNiq=;f&E#|2F_eYjoq?_ekz^ra?6$Jr_vSfXZ&AS;H`soslc& zWReOV?d@g9qlC0cv8qdbT6tmzfY~=3%Pe(GhHMKp)Z-a)e?hRNGm=d+amqG_jy$;a z8V3>91q5$n%aCMC%Z}k0!VNN%`lqyCUr;i<5Pp64I6_@57?cgqziu!zAlHq3BS2j3 zEiFg4%zXIV!{rpQ?*J)pro6U5q=(oBzArnnY%@e;FwjK)2WAM|wWe4@R#g>!nJI74 zaCDrxd~{k=k&EyU&JRUjRgtEqy-3%2!M&6gU`j*zpTNz(3^rgM?Le-=(CiS#x?yC@ z1Ud<^mZgUlwC}+nUG~syn+biAf8TKcgU7}cTqQmnlPw2dJ3j@O0f8lKrv|0~gv7ef zfvUyOlE%!_~sGyn&#oOr_AFH-BOvXMUYI6Ycbrt3d%qH$H__4QuLNMyj*9wT$V|3=nRaN_&(8(D*{u=xwUXMKD}0P};o zx*9v&b=imlu7o#HIVR;E=PZ}}jDdr$aG?X36~*1@x|*_Q#D_!E*jIdEO<6}D0U52P zOp5y|9j?cG?KY;b7bVn|qjk4`-yIAu5Q*qqP1y>5$L&7q>!q7($!gggT+gLgWE(~3-b47YW548$wxxgS8J~7Z*DF}g{=SDs&`*2X9w5Y7kqjPHJfj) zE!jzkM$22s5oPz3)k^i$x1}8WPa8FCCGY*GjrO;aL&|RSWNY=gv90AZWj6viMbRI* zG8((uwv8NFu9j1;E4kplwHSJxTJUAp$sQp)^3``}EARia`mfr`hySd8LOa<~KbJ%A zwUeH>7nenGesbezlKbm)y3|fm$XC_j@$JBShI}Zvkq@9c<*M;NmMgml*W35nzGP9? z%V$Hj^v!hJ^>W}psZXX6?Pb@HjntTbYp=F3wnG_frW(!cz>SJlc98qEDlcw~Q7#Uj z@rodeY=klC`S?Id(acV=qZSQ30S+Pp2;$q$vT2nd1QBUCEd&9%$@-hxbdgBzSX9^r ze2WsoICb0n8|5FsU79D+6U(@3X;<+071{N71SdHL^9;NS+>NL1^v6x|X-I5O-3NtRyzKY=1d-VC8gcD((}3Qtm`i~dY`~5i$BI*x%UXGj*11I<(jJ<6t89|>JzTw* zsR9~TZqh1@LT8;ar2IbA?N(VIl4#+rvNKG-yKj{ZT$@Lv75i^FyU8)oWsmPBUnn>e z!=x8UJ(P202&UpM37RdAnXQCfvGdlO9E$&&Y#qeb{i)sv_AI`c(8(+qUmD8po&neeb6P&xE68tJ zHwwz9{jeMSijS&g*s?RkfL(h_sH=F^hEPlorGkFFr# zgI9X-LY)5663%}n3-qu{h`_xJSOEzqq%cs=3QmGzm7VHx3z>r8WCHPe6 zVu6w-O6UX+(^@GrLr{~_x`DqC0771UjX8%pIRDe@%*))_FNv3Lo%>>)tpijU>kHJQ z!3f0hfffb)@lPpW(XV+jLkC(*xm%9N^DACqHg*|qphwFI%$>*Bj!mqrJw~LE3O@Sq zG-8rsI7k7=PRAazJq*3F>?`zZ4|%gbaXNMBDRDp8bb7j{ToA``>+FEst}nO}s@Y49(hC>S znqIOY|DNcDrno|^LT~6^a5aV5TQ;s(;%bT*>uL&`+gqmTxQAj>Z{jj4)(Ku=Ri;e@U^ev?dN9{v2EmB|?PZ z>Kum)yvEEx&MCuH+#^50U)pf>b^pqiQ{&3?N@-RL$f0;Sr~&nRK-SbR!GYuf%r2j{ zJRmc)*>v~;S(S4S;7Q+?NOkAn#_)39F&%Uk%gfo>2|zKa2!{9=oCaptI0|CxgR)WV zzC_l4uGVUgeIiJ77!wwp1>S`X?^Bz6c@s<% z%yZ>tFX`4%2H6w>M@iLWD+By|sH%4n}@?7nBc8fj}p53qle&!Wx^WnmrOXo!OBp{SE6ELy z%2sKXD}>YM3IPyPt`HjT8=mv1o)75T|;8E}Hx zMhpAP>J6uGo@3@6uRtFL1tww^oUn^Cr^g-#wROkl7ES<-aTr&|MqAKOTnPg`TyQ$W00zSR%MnW7{{C{7|G7T^WEglyqs^0`^t`hWpw2 z3)cq}T-U224HyKpnopar>y=*FU4Ux^upgM4F_p2NS`7XY(Eq+cvPs3$cvh+Q}4%R&rGH)2sRsJq{6+L2@CEA#>Ff^Yn%!4*yC~~GJQV( zgba1ddFeQjpt#iX#)*WCOD%QFRUj_4=aVuE4lxB!%7sVAx0D%V z6|VfI9mSDA5!T*0c<yBr3* zxA5;U8f~Ya{|-Q%NzDgC;h0CG2FomUPY!23T0U6TWSkEp2et!Zh`RUczrbDEn9Fqj zW-xcjV6AR>==ZE_U-tT0u{8hk`dxiiwsYBHSLlWz@@c++yb6CeQXvEoP=yfKT7H#2 zA0oR%v8c#*@=}8W*(nypMtR3ZaLF)~V4>eFkWF9$|D!;ez$+KZ${7PWG(&Iafme4| zkP9acu!j7Ri2&-N+Y6zJ(7G258!E4=-{JCAEoLSXSGhbDx!dbTqCp-#JW{5r`;jcS z&!Pz( z^50um_|GVZiWOQ}KveKo@XmiqGVFOl;NH{DQz;}*Uz(OxuzLcOm%*tJ!V|y_+z=`K z{(knR>g07VYtjA(*Q~&=t0{x~!lCq^Jbz0@(pxpA3==dJd%(P}Hyr#wvM8z0DP_To zT$x*WFp}jCVgoA6dkEzNwvI;hb2h^#I2~9vqgfQdjaZ-tjh>Uw2Vx*pcK!FBlVfYz zC4R7CJ__|bB4`*r#j4yvxTJO)4IU>`)s@|mKw~q<$?7-kO@LDm4loZeh6kvI2QdKO zUYVOZINMcncrO3&KxPm~%XAua2cvV1m$KmV#Q!cHv_lF2#m5ROH2A}Kc`xuwx98zv zGlO1z9y;2SbpCny5T3ffAnQPrIpzgfxfO@uv7@7nDO&ZR%NCM%u2Txl?6xt>Kw;m+Q2KfFbmB z$r^;ww4brvfva{_Fzll*K9x=c%HyViB@{7D_QgyGOp~1o3acq+DV%p#0kutY zLQk6RdXxKP9gZpn4YVqZ)7ExCNoK5v-+Vo|Z$a|xG=Sp~uJypF$Lc1+xMX?NBO?vl zh^JtZ{uj_MQaPaddPa?!10Qv98~^YfoiI<|cfhn7Kl8Z2Svrh8{8tSB#p{hBo!v%% zpAHUZ4!t{F){DF_76Ae7@$|=ZnVNc+>juqP0Ot^Q-)t?%0Y6WrBz=+U&yYE|w&3;| za=$_*4);Q;H511R^8HM(M!tDjI+jQV5U7C-mu*H0;bB<=hzlzPj~B#0G2zG6*cLRv zmm3U#@w)Zsjd8+o3jrQd0khS>ZB2o=*gp>r5sb1TkZ~rK+_PkYUbv0Cv!tg$Ay=or z3xChdBZgT%Rx19ev|*++1qpJqDX;IcVe_*I_>Mq2WIP?v3^IpdZwW7QHB|gV+H9yA zUSC34v!Sle?u>*j)Nnx%B47DCD__rF;t`-Q~@KZS$}En5p?rhC|D=ZqjP01?GrjU7vy3) zwVEgI%Y^*wUdUPGac`U(u1ffc$^+~{bK?GljNFRVqBQoJ4uhxYH}l~0Ie}v5%TslK zgf2p<2;KPx-}~VI>d4}+;;&7bt_{%&s8?iOa#*1Tbqz*Pk9seVO)(5wAe+0FCAeHI zHEoE8#axH`75aREtPHc;soEGIM9ZL3|z#Ot_yt^A@v^KIKKW<@uABMjWqExZxOb334k2*5S5UY0GKpF& zls7~d_f6v$$~%(w^R*Nn;BKIjeveS)$QjUkQY7#gzTDabhmxT37QSMRIEJ^`v<-qrO zEYM!~x&tsGoCyQkz6j#rjGvr-NyPR=QeiyBT7@x}5%!leHZ_9H zbND9Kx&)F?oK4yic|D-w?j`a;0O!sn^1g5doYY_`Y;T`Xr=_wkR(sG=03m>9seG#R zqH|j0XkK*9TJ%invP?FM{bicd81bBr1eMtJam(cOycbIRar0h;W8*(xh8U6U)N;8@ zPna7G9d}qgM-I*b>xk}MF7K^a5&)EP=NuhfF53W3(^mi#w$uG9q}l7Y*OPF;!k3Bc ziv-n9p8C^R>MK={YV0XYgPNXQ#f~^SW|V5|aF0<$7#mg3kp`Lr0Oc*Spq(;T%20PC zTU0$jei+z}786{s>Oq#WGV_*(RL+*N<0*ZI($2oVQZ`0%nlme9B^N*wKndf#`vfJf zk~Jz~E#cZ&&yfP;YxSY(ZeAsyvmLQ7R;j(Owi?XK7j*Y(D5XE4r&mjfpAS~cr$g^_ zjDM#eS|dZ{B`Zzs{xdt6O;b^VLr0BT4+Y5Atp$WC)YT=^kF}usFO9Y6owd*|E~7TD zO2R}xd{uHv&gP~NdL5fRkG--b@HClNbJrEN=L!oh61rCv&3jFT z>)J|MR3z`Nyv_2PWdr#Jm1t@OKp-C`?l1^cRW`^CF|&5y9x0pFi=g>Ky}YrDox;-pB0n8OtsxmmXMy}~ypT|s^~Y2Z@s z_}ArKuFJphr{<~hL9ff&D4+W}WUyzZz5ym&eF$$1a&QIyN|h{o(I#0sR=>6_p(rk%Akvr1Ax<{jO5sz3Cm?z?H*Jsoo3 zufNvll1BUWN22Kdw{T|fqG@l*Yu$HQ)Wl?^4Jdso^{Q|~_2|3cV&Vq3?4ZQAWh%)2 z9E>O7AY2phZ7^UAQt#1wZ_6sEvyC;@K2~bEUDl~Gfir_BI%auTFq6msS$xGQ8nInA zW~E!W=WJ><`A|)BMjl7#W~;F4yB~ z_!XT|SkU!5WCt}mP}F2lh-WB#r>u_A*WIaB`o^7VE`9M7xj&r8>mc`bnH4;vO*^6G zoW#F85NzyRsji2EHr1vHJR5De#l^o@|D~JKs~Zc-VUY;t90*J=g^%Q1l+`(lWYj z53~>yXviM)GJ%dp<)zVkdt^#V@SJrX>@^O>8dkyX*g!<7;5Z4fe@=9M4?g!0RoN?> z)a?i0P=^5`Tz9FiZdcON`77f`e=cj)DGdK>u?2sWk z4}z)xR1Dn=>}X-7?)zlN=st`S*$zQp?30&3&JXX$ao$c@2M~93l6oAFV=JGCG9o?5 z8PwSmQO{v!WQT*D;RHv3r=Kb8An4Z#YJCta%n5qspsb&~Bqh)UudUbJ7t-nLgV^g6 z6!AXz@Dudd`?9wFOFGSZU#4r%P|^FcAA|-L{8hlPWllaX7WP4sRR~Fds>a z6IH(e#7T#s=RQfF9+J%(ynY-SJw|m$zNrM{V7RTD zPKhfrlj*h(<@;sZB(0=#CFU0*>D<7Nq_<%EM@-{jYun2CVA+xdqo>ATfYJWt46fcx zIUtr_`RrQ{>hiJd59r$bv0C-3A49``p6Y+1wxaVV&|hpP`b5@e%*e_3UuT{QlPoUUmjsQPD0@A%wjYOwo0Q&x_OpR1?5&t-i!I#r~5 z;_~>W*Oxz+cW9I8(&vD#lhoyye5T?Fcz)Ex9fe>6IYXhk8X70&(_`{bU?7P+)XJx1 z75enJyiwag)xMAo0@a-Cps3duQr9ro`%cJ*163}5^K%rrao_?U;lp;QtDB1Vb4txmjJtb>bvv_@sw!==XCn!7ulk02-ZSnLh2mq zgjyZqeBgtf+5f=Vj)_mKH-&ZNh^0~2d*D`~DBsDA!pZIbmGopX(LegD%8hL0Dg0BS zU-a`=kh`&$wN9(OeEziBy@U7(gFF;VZ9f(1DQOI9$P>v5D6I}|DZ$33`CS+9`9{66 z;2Q<22ftCU`W>El`!oElntls>Ihh{+Rz8aDKlQB~js1G~J7Bk;Y0P)>sld{!ZHxO} z{))Yh`~k6>Cur*rvI!OZfF9J}Gx5{?N7*8KLjt4SY1jfp`E$lV&Qx{6(sG9xIr;7- zRP-ar(H=Vcqx?DWi3Hx=b7$lqrHitt{&|^5b#ev!55}eGX#98$@svlpiIM@ z1z!KE!Bf!#tQCL_U*DkHp)J)Dr=TsBolgO6ah{ZB2~05J0CsFmi38ZJxd2}96z#r% z<2j2`E`r7{qb?Vra^Fh>F3MVNPVUsc#q8S_bUZex?E=?AnsrgO0PX(hqHL_=ZsVcX zcdmH7y6+Ou9;=edxnHdYmKIuXgvBx%hfFeCcWMRNU~LFcmSU<-g&EGi#*i+cLU`u8 zcluwFT`+{rmtfJJMSom^(6pDT{wnh@Jk(XB{3{sTEZX&}s`=qp*&Q`E{05CK@*@8x ztHh&Et*@co$jqjDJr(^XJEY8V!m``m;rrkHzN*B_vLf6JYF-A`+e?pKmVMCG$Cq)M z&eJ(pUYdSYqk^`1saT74SLEIJz?>_f@O$ZvEASzoKplTq+JQ;Gs~i*OewVGaAF2Ky zDEyJ0{zGQ{Z#z8(WcjSC@IskDU9ZX(NkJ+tX0yS|PP+=9renB9YA=29fUI0#=i6{9 zvH5_Zi|LHNJpTnVW@Eo`vTQS^k`HX^QR=4WG1K~-p4SyZ+{b#}BoNw%oOx_dd)Jv) z7xLRhXC7zSO9{(s8PD#AaemGEprX6OK;g2Wm}2cTR2_igRBxEFFDidMq;g(Plfv_w zf|J`Bp7$d9mJzD&O%ZuH==)eiUS(aRzqBy#8XSu+9=ajprC$I!{U~0`%TDa0GSWee za9J7dr<0-O-R3GO%iTC5EFH!L-T35>rOe!pLE1#15)1}~yi=wJCR#o!4cU%@JdTXb z*_%*pwKEi*=;ggTmG%$l9Yt3o^3t(F>5+MN<5z@pZ7A8tZ4conmLw#B;?(x!D{$7ciwo;ATTyM|VXMD>`{DFv`g*Q^Wt_X2zQ%fe zjjA?|`xrg;FU28hrZ41%o317|)8|FmMbX{^@YJnQmKc)i$M{wh5yMVR| zt;U7^kG}tLJXY4p)jm~$ZY+BzO?e#t>{RnRiwH8+)e9>Tlw0v#W+8XxdCK5_W~_HHXT2BboB6=U#4IanLCU?_DMhk2%J(1Pc_-gDt=cvI+I_QPvGH6x{7tl5XjT6|;@$+%rmFoPKWCpipF3=Kb|>dt z*LBTvB*Wb@C(%S}Dc%M}8oZUaSHryunUWHVk|9D-F3~Mbrc9YaLdH-LQ7=W2|L3#z z8M&(O@c;haUiX}{_u6Z(^{i)pp7pHh`ZmrG*OcE3)Zfm_Hv6{$Z^!vs13hq5B@#+s zwjUa&A2Lv|a_mq>TStslqtZoQl?5kARi(K5PklC2Sq#eTKoKN%!WZn1A~(YLL#!x7fnU+oaNVV%Y| zjL|%sWxe(-a;SfKJ(Az&y%Aw;2sB#!%j+e+R+kX^e}Sfr0E2*#w9bPWXkHdh_+5=&HCVqb%CK7M%j6etsto@#`3CZWEmV8Y=3PdFbgelb4+k}) zo+^S9p75!K!gGKU#e^SxNNts%k1Gc59qKu#6kp& zx?tCw%l@%>R4(qfyQ2GiL8d93^Jj+~X9~BH%u7 z8E2(C0Tk*->!Cs!i` zthP`cX6IX4x)d)7Aso(U#^hOP70su7JBYB<9z$v9d`fV-QpjukFAo*}mrZC-DHiQf z%tBDBPnQ|LoLb{S>P&xK1?rFe{u2D4*Vf;^)(Y6z z8n!nDqx>Yn`s2qGD}rCnew|`P^2@d{sa6!fEMJobzJV`q&P}zy9RAAJxT2-O!WftE zo{}pwAFDT90$O#$b6{)q;)c-YGOVS>XMiE(@)c+;yit(7qmpunVrMM@-;W@XSfjRQ zqXwS-TK07|a_02clRI*)ruy4bw2ai>ex90cx%9Uwzh+~g`s?-s*;Z@)ZQisztBL+r z(IX}EcVt_e>}NJk$g{K*v4SoAU^FV=|3;8FNr$IYF3^Bu|73iQf9ylfVbs;wx**jo$L{2aZ9B6yY3tRLR z)iGaKcxF_-e&%?-@Z^VCTQK&SggieVJMnCzmrjeiRbgrNSI<=yo!ueL)t;&%w*Upn zoG|ejN+i2M{umNNT-+7|d%i!sV9Zg@Ef9_Kuz?Yx1Q+uS+cd)PZ~?OYKr+%z9x4!p zuu?Y^hafk?5xH^GNdO*~?p8ms~M2j4->LQymNmjgWf;JlKBa2@=tN()8h9MnEV?B3~#YwGgYeK3aY)WLJLq)^kvqvuacqO^js|RG;c1m7jyEi~iLCYCA&?gE+SY;ZPnEbzbix(gPcJ zA{F$oTtyeb5?`rW7l}03$F~&0Jm08B6^X(UoMvP1XfTQagu{;e6Ai-wY~*ev9nIs8 zGKeegM$$(^T(%p@*D7RZi(Q-56*P@8E`;yl5o9WvUGLtPxT)&Z5H%PZ(fcv&y<6aB zI#!BL#6}*eAv)BDW1Cr09-t$(7tQe+vUVla*ovyg$b*YLXj`G zCRQe3@At1MYUYHXkuwWe=K{Xz)47RnWi{b)*ss>tgj3-y<*6lx19j)r5(Sq&X3Hs0 zY#Sa?tiG!S$I0i)U0dW9FPngpK_G(W4x$_ua*!3g1gcG%(~kWTd~Ty05lq znihP7y}0aN)Z*Iks_a*LYHM1`tE0VBC3Qq$#-+0|<|C?%k$qH0G>-8*wbj9TA`Mv< zW0YAJt}J}k^?i1!E1L25@VcUAES!WspWz2}|MrU}*Fz7>UQpZWi6VYps3(f~*}A^S z3+b_MebJjsA4QcpvV!R3f%@WcxPWeJAO@GrT+I!3sL$YEAANWXopqUv+6wC;{^uG9 zO>taQMP>f{`#JrtMqpEDR+SN+Rdrcy$g7}(-cRKFdudgik7(Tl4p{)v>NHnudko%Cby^6C*NZh$mQU0Ul>Pr%8zqbTl_dy4^i=y9!cZ(NJ|O28%6I{fk8nxQkyd7QL&k z0^}`6SDFxAaQYkJg(P5qty=?R;Z{#tqN%#xf_wXjy3Z2#;A4{|=3YtC48gwc^D~c{;YtJPIX-BL%iS&{nL% z5-n^eQdRqQqQCvU@Nd!4|7uxr3cO$@doJlHv;sNk2wR?jZ2D;FN7^Ge@w0lfy~wV4 z(dqWOEQiN62e}nBu1l~LJ<9AiFFgV9$M&KfQW1SQ*oL{OP#t)wM`lWR=8ub+KWaz^ zaU%e|y@ROh{;k~f=WMBjj^YN7EwpvAA@(nNNHRDSaBnsd1!x_wigRU#J`0q;{tx0z ze%>D%X6gze4FM@38n(v}gVq{G8ju@Gtj;;JKh3wD?qpoGrjOcZ=c`ch=-f#>4Bqo$ zCvkf&vL3-D`sc$Pgy-yvpk&xc=0hrBlg{E=ia$H+-6#IgP^-?!5-T6ySxjM)Vf`*5 z*EQI^M|JBWnqxsnchRwsH@YBX^Rqf=|N6a)$jK|!njf?nX6V_t%gj3XN%TJJ#@CAm zObMdK)&|K|;K6n-3cM`(t&z~ThF&kMutt8#95OU@_ zu58(@xidG|TJJ90dh$FzCYQE z%oK`*(Tz-@u{S{-4nSMCSbmde3Ad5Dc$4VL&#pI%wm4;D{LP|=v8_-YzghHlJ?+84 zS05FnsS{_K6{zQK5!wEudjs{i0pCE*6fw@aV&XaoCA9pugX&a8MV~9wu#f{5i_S-c z>=@Jl!j8d)w~7X}MD*!@bJ9gi>WhBcEXCPx7#yrVZ3m9M6*s<6TW%H2 zqd)yP0bayqs!|V8566mFJwS8iYF`i0f=luAgUzy4)1D$5*KX=5y7Af@Jw?8AiCWuJ zH000oJw=1)q1&(@9KAHYP2BLeq(WG+-@mI}h1Nd{K>af9N(a<*UAZ_R?niKZkPt2K z@h(3OsZ&BU@XUvlVEJF3y305X0$Mn@l^?)#m-(%-q!@6?@*kBVp~+xoAYvOvT}~H? zC$K(gX(PB<9|kztJPcBl6-Jwb^I7MR`FyHYFOgg2;zQ{F zz@3(@Xjgad+$J)A5DMhEi4>E;*cI;X=HO*2b?-n09N2ttuL=_nO&F&FXNZ4QA zBOY|FQEmH*tC6|&bYGDjr{zSOWvJ?_Uhj*$LRGp~q%^a|M{SA^rW$~2X(J1A!V_oq z)R7I;fv2+>%l6ZRRPakWoR=wiFAS4~>bZNxs?4V?10oIDHhH>_y(jzFd!8C{pSVAN z$B1p-p{o>#5p}Von))w9D+5s@zHmG|B zh+6J>yEAYd0tAo0IzY5{+tXa8FB~5rsu&mDD&Yaqx$@NSO|+cO8;lhpiie|su%08; z!w-m7?!9kw3T67a4;~O6ym#MgFw<>Ot`b?fhK>MOF3NL!y82>)H9x;<;@Y z`Nd?oC^|t7>Ui6WGpY6Jv_tVym!~#3Dvv)1k;$1{;wq1bYHIDnB0ou^kfwD?HKiQSn5^WEW5i znnTEY^Y~s&u(5m2v@ASB_y5x>@iCF(oT+L(CfeaONak6OR=$ zN0(1}T$DM36VQScYD}JbWH8?R;ZU`7u(&PV@0_3yi~CQSV0SMje||yhOjY~@#BNVD z>AwHLxX-78)jg^HXpN;&b#MQ^4Fl`^9m1Tm%^~>sU9zdcXP8+ zrJ`G)A)J-=yeMiXHcUuWNkc^2X52r+vU55j1Q7#?fx_R>*7Ht?WB7y(-@a<>fzidU ziDtMyS&bf|LGk7gF}Rk-!YE)NT2%rCRI)J;d_XfRl&HYgB)$ficKtIVH*Ucp!j7^= zJ^GAzGC091oM6ebqNb|;thg?CJ==HvzPR-o>{@L7^sFfOt9Sc2Kem43-K~d;Ua8~B zM$D%f(Tuj9TTjK{X|-S|5|s3$vR%pMOm%puP&mx$$zh^u^d}QwnW4?>VX&f>%uB$? z;Vs35{lnm9A_WFMa2@)-JV|ZeN-LwKpk8R4bj|^#^@TM=Q1akZyPQK zJK)^#MD_TQ9`87V3`!Cj_~f=N45#f}zFIGe90=I}Qvag3OZW^>1gwh1$1;R1n12EzffIX6c1i#+&ts`;+E_jyq( z^1^%ks-72(qL02s{pxA;#q;6@>&)H={-BZN^q>Tm!#d~a@2i<)T!-2LXEvoqLd}C+ zy7MicU8+64)|s6V&;_0@|HoLkDx%l;I(_Q}G0QmbR^7&ls=0VSbG@RGuFKtJCIrx) z@yS>NtmV^c+&D2YxZKP^SLeqiR#vB;kBd;W8+bK}`z_Q9-6GfR&*TAld z0x!mI{oe9ZuL+zna#(eohE%}U)ML{`T`#z+*35`Rw#^#R6$54nUeoGKwQ8E^2N=|y zE*1i94onwTih2pTXOv@xwv&;jI7>C2fzDr3V`hlLEL+ux*CuI1G4Y974<6a7KA)kX zexibAgpa>j?bpS)=vNlO!3K!0d|kX2Tt>ekm>Xvldm^-{6RYYzEHc!*nIid;b`VZ^ z>id~uZScBDG=L$gH&sO1rqZEVB4ksAZlRxS_J(L{zBD?@6AuK2%1eqLtj4^7=)gDX z8{BlBF0VdYtmLkSALfW5$k2aauDG$> zZqtW6=|Zfa4!Zj92PL4Kgc;Zk1MoJ}l?%ABDn@S>)8_~BC_V&lcxW5dMwAxxq6@9h zgPCqqPrM0+y-mIHrsxaZ)%ljlh+|n~9WMGn<-a9ln|F?9BLuu0OqnJ-F%=w|{KaMM zyO4>d;HKy8R6J_vCXvL&R^0A@9nPpv_32xp4y410w?GHWRpLC68Mg~17k!bj`t#t9 zTB-WZ6Se;<2Q`M3ws3{pkXJkwCA3~ez)}LMrs4|!S?EEH`UDxze391qjE*iv`GQLy zKvLPci6OAos*#4U|8&LxyaBi%yi4YbjBM`fIDFRL*P(aAX*0`h9X~rqEu1gBCEHlB zff~pE|GS$i+T7G2=t-=w`mcqJsVKYTGVJQVnW%8~%-dpxGw0OTlOkE=goi&zStAff zeeMj*HXVCZeHMsnAuS5RS`dfS477+_q@Mt5KCiYc5KW`!ZcRl}1F)t{WG3QA4Tqzt z14Ljg*s2M!mp~1c~(Y@Nr2%SR=<}I(Re*rAuc(B zyjh)EBr~^#4G7^OmA~jG=k*@*=8D2<{&+iU%25iCrzcq20bPqbyy}Ge^!*{`i z?dcxxbUIao=VXTZ?!F#oHfQGNN7ix7jALM!-h50w{4UI#$JDrYMP>Iv?OjG!=5V$6 zU1+C+)xLKjECwt0VmK1UtB#As9YIzaOI8Z6Q?A;wSVTF`sjn8J@v|yo2@>?5Ro$0} z>%kbOErCV6Ni}&-bgk^$Zx|8SZ>aYgMwnyNl=tAp@2^(9hfv7u@)PfgnNH_y_2T;? ztLN-kw`~Dq{tgqrnrHy|_D-9R5k}T?(2H1?3<&D*PZ7&#Sid+iorAez2K*Q&{u}%~CZxmml`h0-B1)J2*A3*+ZQlpo`2isq*UMd=2+8j%c=7}E)ue$3) z(b_mXP0jjH9H_Y2q>n^ihenqUgNp$*=zzT}RM_=|U~~KD;~sR$c5x1V-AB-sE7%`i z=VOr>!}DtN6tDjn@Vs5kc>PxHBCm9AKn5yAn`2OjSKt2lW8q0yyFJc|v0mSe#9{MJ zb?jr&D)@Z;PxM>Do=3fbcx0Jz5PZH`*z;P?BRpd)`})>(FfP&W?oW^yM)v5#Khmb% zV#v!>7w^O}K=#CF-?a-1$6><8jd8cC2x7sw~1xEuutCg{{s0(He&(K>HzGEzUu2Rx7!{4Ao( zAd>Kps8M8h~NmP-$k$OhIIklCZ!(U6jtsdUeg+t>1DYuBp0E!Z5JdYnfMor+Mw#kjX_FW?%(@7KN%S4S`0L_6^Vwf76#IbLro91^(M zcdNLUjW=%y;ny*Oh2bEW?80zr#12uT zPO!1I#p+v5mTF}cIsFI3h~>(sFC2y7)V>`ezXFV~)yL4T!U70?H?&e=0D+Lxfb)|< zJMxUsrfyxLj@qlPVUGdBC+M+H<3WVU(1gN=pq}I~Cz!D>wdyNTT)|XmGoV&W2y!DW zG+5r~?`rs=LE3uu~7CXeM=c6@vzJ113aOkvl}m8jWGHQS&c4OUeA9y z(naktI568FB=70EOH{5MyaDmyjz;Omb(13bIfyfk5;SkyF`=Z5o_(0 zbvpEM2i8!fcJC6`Wge@;4LPhH#8&_?DA(Y!&aY7|cO$C?t>kVos-mZV-7V@?u(JQB zZ0jnGZz0SZ#BXlQ21rl|3H~tBlU>fvz6t>4nS1io?yp7FB-*|P4TD(``7~VP_lQ2J zvsT++ihw#C095H7kqs@) zD{4g_TFEfc7|2DSMGn2NK)2S2X!s3&Dz`ekAbzUHRb(fo_1raQq8cZwPv7 z`N5{@m3<;7Clo!Wyy4pips!A&*3%xk&v&OYYN?#zu{#>Nff`@0p@y1iy-^B z^bYuc-~Hk`Lg(H6;$7qHYIWZMI39YbsRzV*{_KAcsgk|a=Lf}L{_OCLxQ~)&;Wwh1 zv1P5=`3;Ur;kmp>KAw0;q?-O$`xOpVa7Z+`?SKy_3HGlrmYFx#8!)GLQYcHwj% zBXR4jZiIS~!tt{2S_BkIAZ@Iv<2uj;tm$_8VoT21Ck-Mc89bh7F{V-b54jl#`e`}#|beoF$CKz zQ2s4HB77CXub}alGW`chFB^`Djq1Z65wiux?)ec4?}pD*rIR9y9HY)jQIq2Fwv(a( zF?q~M*nViY^Q73qc5j^$x3Hb_C((hQoqs|y3EGeNNetlqUw#t(dHv3xMSFh!G{0$z z`uJz$Orz1SKa0oM=)wPhiQ(pl|FIjnP9t3h_uHHnxAXpt(;|hR@14f31hlJlMqJC! zhtJsU7Mu~&IJj=Vh`N=6%t|jlx_RLj(JA&qp8w~;UqoJ4NSzQG(aH8Gz8gX#wIP!h zPe-C|5iWy^6yW!<59uVfM#Vr^9u;E|MV(r>sq23gIVGoj3kfy}iB^PDaW3R#=`U7L zs`{*24wIZ3K&~vlv+d zw180_dsGmgXMPoTrXKfk?o?gf8cdN2(fwzUN`=qS_^b{Q-`A4Yw za+$4zxj>Ed3w@hghD^uSxwm`2Int=fyKY->8l@ ze$o0WPn554*H3?lymXY%<;!tUk3UUDx7&9?9QgA`L&8)3C#tFIFM{spAn0~cJmnM< z=E>Z^o{0Y1UNgmnow5qb1>=j5-LBkbVAAe{d_8Z7H=H~{Sj}anSK%@B>;pVz?!$J_+zM2MJ zXvdKpSQSV+t89geiIc5b^PmZ`cI`*vsT5k1j8D1jfeqkXpg5u>KIk?}wxC7~i<6HV zi&v_)M{L~VVf1xUmQ zB^np}hW?~%`~0;~?^N&(SP3MbRY~5?c}}k+Yf}<#swA)G@7QGfchh89$ltw_rG?DI z8OgGi^Ch)0S=K->;8*;L8y&A%0+R=7r^w1FOAWW}!^92KW!uk)}nF2r{#c-LTz?4om^I}m<@+jq1&nJPa+G;B$l zw1Vkr*m+jRq0`f1(q(g|r?pL&O;H8`j1V~u7=*7A->b%_%f`m3DQaE1Y;TlKQI#@e z!y2m=z)W^nY1R+3qM`f4Ae}yCAJCQ}ld4frDd|4emBPn{WXMiPZumSy*1B>%M^{Dl z94iOvIeGyby*vn>01V^R^_j9YI(8ydYb-73qfAr=+K*OtA6A!Bf< z5YD2Nft{6D5H1-1Lq5#n%Ca6;{YYh5JJgQ?)vXvPjJB@MU{E+RrcRd3irR`SVVoFq zeU^ z(aOw`o!ND-9GSzX2It7;p-(|4l7XipfW$DQmaFYKU=4UGIak)k#sdF&LzoD+KKv~{ z`@gL+q=e`Ue*d95nk#E@R_S?~WP9dmk{z0-N%oyQSs7c?*5=9lq!*$qoNuZ9jyy@)Sh zDB6shK3OfTCPz4*SJxKGi3soRE|d)s{7k4WSKA-gsVYVC-psP8`}7H;I7bmHz9~uP zNmyl5)zl)Hk@hM31g8s4xR|5X7l928RH-#&?Pfs;VX~klo6^U|z`cvI(|Y0#bE!ek z8F>Y)6FPzc-^Xjnd@lWz8ZtBgvi97L6b`!`HRK%#mo=#=TLsQg8(dRXbe!h@sh3{o zkc8^+464E6DTh*xsNtQpkBfh5+4rMjZCYrm`|7sk;67u5zn z@<-LU+S21ZtQOXm1>T){2HjJ+HW;mn>*#C^G;B=1x{Tf8`h80$4L$x{&rRwCiHYe znNC?av7s!AS^NUDYr~wXRyUM+v1Ry$BZ2VqL_>KM41j`0vY&IP8rw*Eom*5{Bbkn5;X@cZ5-vW&kg zUnSeaZs~KC)X5y{u9Cg7`F0|P7L0YBraKN7_|joc)w-$7;B!5jLgo8J4Qnc|#^awh zwH3h&O=VuorG_^`x94UU>_H4#JpnYt6ib}|jZw^bGCRU)euDa9JTSh68ybw)c#>;wLEo)_=Lxh|4D9vxP{oftZu&A|SwkKeA5H)H4H4J~ASUl)Ykj25z1Hd$q0ZRx#eX)9SZJ*+Z_l}xYS9Irz)Xdayfgc#jQ-kcQHB+0EVu1n#)*w(UMm9Tq0 z>kH%!B?AXdxVx*8Vp%J!wAAyhWo9Loz|m`rrVuLF(5R;+8$-o>-jXba9M?v+Xzfd;4Fq#hki@bN?_e-j%Y!20Fsk#_ad^pRJ&2GY zoCCT*&7893YFHat!$|!0%4if`Uh=LD$Ou9^JPI<3$IGGjT9Tpl|N288fl1 zEH1e8BvdR7@x*gI@dI%m=+CdJyW4^rzN%hr3+E9`*QIS`er7NGgj+V+0Ah!dz5xLq zvs|5SE2kQZm#dfC$=a3u-D}NAAEb&sV#&0B$4+nRiP@2$a|wnkXM5Q&^~b`1(5GC7 zjr3!o>d;s+mB zcajY&{g?*95leo>gmDXJU_R6d!V0r~t`nvRa(}y%tjjYp_jZC*-tA<5sjuENPCSD6 z`#U=6|5jKg+rhXk{ubMf%FkC1vs|YWUIZ`$$}P-F}@Z^5T`TSrUllGC|x@m*|Y0LW2cc- zzkN2s1}@9sNx%4b)H*Ohwd^8a%sGpqo{+ZiW?=_2g9h+YTBR%a=z4Xmi@eb|o2^=1 zFB=t1pEx|S1JK{F;ve-Qal;$wf{z(+h8B^Jt-GkT`i7ctz3j^;E?ke8OkdTtt87<8 zFCTQ<_GVAj=a_-9WL`7pM;d&i+ zLnuP)+iPx+BeJj$0to{;Z0@w_HB&Qp1Tp$`ll4n7~whm)APqRmC?#Oz&3mMp+|nI>N-<PA@@udnBG=LYWla-(d>JKb)Q8A&VWUM4;#>)@MtMiCqBzrI&ns{%UaB|)0!IVUBy_x33K9*FYd8sxsbGGFBwv5 z(B2L!>mat3jd|Jhh&`Icz+pPHkh>O$O9z^laKYFf+fMM-&t=LMX+#l3OV!xBwAij6q3UpzTo^D-$)|el&6YMlS<~q`m z98A;m&zP}z4w(Z(y?ciLvA?c9Hy{ya>Y7_+)si2g-S^mV#l{?fH4r1dETh#tNarc! zo}JDEX|FdI;Vf$GN(ww?8~H(&$JgspLy-;>@7n8I#4@kFh-&YxvT@1UK-!tsS*@?W z05}@sNuAAAA78YPZiZY#7gD%*dY7IQrX33Z10GZ*f;-C2HAIGkKeqy0hM7^o7p6ox ztV0KruwmN(A9t>_`^<@%D%e8Y8HTe4LCZLl*T zqubpkiz5dh?ZpLqqjRd7dYddVhF4b&4&Rys>;fFnEtEeT;b&-CKn}9JrG#9IjHM>F z&<0tU_R$1`dSQ`peQ7EB8TUBn3Q$}en?31Q=Hc+_(|^deB|coi{0;b=u#DglkTw);8Y9H=0r90{;cg0C|A;KN_G?JA=e+G`fj6PE#(oALYk&%pt@`8fcp zt{_1fOovz*lw+(i&xNBDa9P#39iamzfpi;(Grj?9- zfv#RwqnU-$@Sr%#%S^qYfr}Cf2K@$s;Vu$^4 z8o2}n*VvYK)abzmOPC5A8OXZDtTh{Ef?o?<*T86IgQ_upe?wr@4+6u^!^JowtyeeW zRsp{FGX5h28UI=WNBR^G|A>4`Q}QQkW8%G0dN@&9NJTOmn?g#j4WfzmI~_hj9I0gi zCa$+NK^yuTAq7WCs9E|y^*}>o3dLGx=!O`u#0`7pe5(xcW2Rgz1a9asV<{_+!y`OQ zMfBCy-SNE-G{9+E_xF|UC^#1Og<{@UZRiVz2YK=0kL~hR?7fKBPE*(23(ok6>Rip) z0>7TC=B(FbC9sJI1bD=2ydsWiiG`XM2rPobtVN1TlAD{rb)`i7R+;xn90aZYeV^=? zg-zIf5YaZsFsY|Ou$%c%dXYVL{yteJt0${P^CJJmz(&L`4=@k=HLmRkAMZ$YPd|AN ziXeR64^ygq{-cw`j@uMAZDRn+c6i~ z<7#?;nO=|45PxjyQUlL_1Aw+lnZGt-mO9d3){h;BACTzNXR5sWWk&xXOY=Wr+hj0P z0(-&2aLDa$gCz)QjB(O<#Hb1UkjMNZNBn_Eh-zIjD}AW1SEs|B3ea#7t@F#&=KHZA zkAO`8CH*X)F3&M&t_8lvVry%%wJq5n2g#?R2!?_t*7juUOOyuC7dUWhN3!*m{{j1YG7<@9+1~0 z@Djj4+`^@#2jTt3`nG=%;rd6_zaNy<@iF5;cwP^@p*B7Uqv5aPb`?dDK-qK_`QPTW zM+OpvuHeEbnXrxuo!UvIy=qV}xJ(duB)uS{)ZGuk|F{JekQsr%OxoDEx@Vbs>mgYf z7qSN3ojuc(IsKZ5^8Y*}zjaocAHY|Dis4>$Y@qCcf{ktdDf<}*mZ`V@iL?-0KJ`zy zYVn!<2>k2zZ?Agj5gEfD|9%9{fUni;M-aH#qE0*l7I{e3dsKEtv}f?6@;t%!_+zqG zeUh{FGE-2`!HydQt0o(O&W{A0(6ba&Zh%ZkX`ZRJJ!ZR_&OIh;<{sg>Xs{Lidxz2> zZ_@(x8;S?Xw2Tn!2@)Wb-vNVUotyvkdAh4L+5fHaIYAxv2u}=>_0vOMi{a@+D~Eff z>OL2HEZYA|7CP@!5By8!$CuZ)RSYCJ_g1g|OIFU>u@9Rj&4(qS-L^=+-kgMIHo|T}Z|1X3!q3`Ms&DG_75xJnmew*x(EV}Q z#(37LUVdD*3m?Fd$7QRQr?@LIq*4&ePvg-~(l{*iuPKHy&AjNcGf_zB&%MoEV0WrM z|CSAEO^S6U((`l5Vb=~Zs4WcuhH5LXmo0;P>fh?4f6GO==bj6%PSl0(G<@$=qX)~` zC2LOs*Ug1o6`+Rp42=)DgaTJ|7R?R0g!a5N>16Q1D2`dzU7QJl$w6}=E~|o%K@<+8UKUSp#DI0F9w_>hAaip%cS%*->th}+^kH>=La;Q)im?J}oZ|Zzad{A=$F1-^L zDu_ADm5<0mCaC3c9|O7gK!+^#!cZBVw68qbs!L>t>Sta^Qf~|eH$R`GwhWbBu?SU$ zA?NHH&ZGa(xxnWjV44t0K*};syG90>(>D5ww`gpHMa+zbpWUcG`eZX)ql~%&* zLlbsCLCp&2XHKk1r3rQecABCf3pj)8QS)}Fx(03m=X^6ua-%v>gGTLB)FZ=XYW_ka zpK2iEbU&d}tR<6seFXt{Slyj!VWkHPSnD!SZU~VO^nubssV!efw#EUfbsS0A(0;eq z;A^$#(=M`3QsvB{S+je0yd&h-6??w>IdJumzE-Q3o|7+@eDYa#7*p+N(;PUmW?1B_ zTviYlNzrAk`;kn`f4LWc1fs^@2yM$yT9x8?+SMU{_J*>JE(EY}Brb+- zGdXQi$5<|HH2x`ZWvFLH%X&p1!$`WAfR=DrVAC~@w~I2@kQ{#1!3a2@L1bU6oulPb zS;5kO%`U+`_0SkuHP?@8jfpY=A?FwC3&zNTR(_13JhT8D^Bt!*Dfl%$@D)oE4Q&WT z4SIRqD1-^k8quvv&&%c|Kwk_N7l^n)9EQ^c0dhp$i9a|1YO=2U6u@S9pRftMKf0OC zX6Eheg5PuwDzu|~U_?c`W`{U2;(?$f|3|LP(aM0Dj(7pi46=ZcoOg2GCyl3P`L{oe-5u7$5Cb(PRn`ft`}sN^cm1qNEn)= zSmzw)!GJJ6dqLiQ&3qq1gLxtjK!n~2*VdYFgyu|$(3}mAMI_4L8137~K~uk7O&cc* z>h<&>u3%#*&}wlssTXHsQfi`Os2A)VJIwvUWx+=S3JQA$YV3xiwfz=6a<|t3{(FP$ zRlPE$uU#Vz=m0qJ1;ms!>d6;n_tAT4uSY|OGvDPmk`q z?teM&#Tay=@%E^fB&$fxeF?b;zpAfZl2x0pLFZ1O5LE%~hM=hRNep|_9m*&4Kvm5i za4F-KVLNNwrID)fcv*}{zx5jwlX2r^A{;`~#=`+VKzysp>_m^eWTFaC3 zfe;K4YTU!^DQ>KvnIqd zo5eyoz~C*uogj?-EAqXUnHjpJ=Cg*`!!mS?4yCscg8(cs3mbax8qj4J>^APtcNI7c zXqrBC#`iL4Dpy`EXiOPu`Z`&tdLPV)Ou*RS`_Rm6PpLXSNp>ByXoT8E;;V9W?$QxB=^i@EQ||qf2cSCr0EkjGb&kx4W#_**VTq|v=E%Y{{ygubx~+vLj0FUw z)VVqG!59whMFZn_XfF1I+5@1XV80#O3dExS^%siNhjZmM`k9~j%pY@Qdfl;+Jgx;! zRGmVa1yCC1Z;*pL`wM7|e-2A~5#d%d7pgXIBK!AQT;~0{G#-Am0W`#g9-n+u*0_3Q zas^L=Na8ghM_~st4t64f>c^Mck3Y}H_u=s-{>Sy*@9n!U<8E*ySUnxWOVu5|;v%40 zyd^!iPDDj>3X@Dv1{T@Sw_kUe_Ye%kM?#sNEz^Gcb583SEHFU$mW?E6LXDKft+i=- z!pym9(Oa^p4x26XHv^Q=4GG^$vH^j<&e&u90F6{MN_kwr1Z7h(N!u-^}|9=P}(4qx?FOGmZy-ffP?W ztq}9gqn&)LBZf*cMdSf>t>I4VRlA#0dU*5(AX~&>?3L{<6nWf$W+l?+HgF1TF$L#< z2(}!Z6C%*T&-7et5*p#+KyIBcJC*2`@IdO@Lv2!gMfdL|R@$$|lNanKk3?{RvBMlT z8aRWt;>@yS;0aGsg8auo##YB$4f9*>qvVL}bFR@7*@n)4_WST1?Ggd`P+z0g7`L1& zD(ntq*E%ZVVekcDS0kCz6YzXu;mz;yvPk_mihqq_`Z-ZMjDOtL%g@_QPdCH_%)aW>eFM_eCx`AgRn9vy0kWXxJJORWAgDl`@zh9r%Z=~I>Ulotk+1zLNJ)-IZ4);SD!_+1MI|qgtr{?s z%im6WUSlmRn3c!((KC!K1VmvPGk`V+F=PRBqQ0tZfh;zMgSBFWQFy|>d2xYk?7s@6 z@Lg?F1~2*mRZ=Dk(@_~VIAG*>Se2mh_f;R3!M2>Pc9qGN)k1u7S}yyvXP;m?vxBg^ zQ(dzVprW|bJVLV|%dq_7?vaJE#?6P`ic$XAZgBJo5lH3y z=;~|;fWSjsK0Jh?aJFburxwcexX;-LcQ6ifk<6&3v10{v3SvN{d5ATfnMhXZ!4?{9 z_!%E%4mDJlMG)k|Dx~Vgxl@Z*o=c?6CAn-G)ChvKaPd(4$1>k{2k_eb#9TY zf9EkBE~-m!-Uz349zo}C^|Qcg{kr@FdSr}Z>+oFQ9tNV#TmyOCCFYmW+)ceI0=ve{ zBiN=+YYheQm?Y#0TE=ShyRu3Qd;T3gt3~h1n{VBegGf36$F<#r?*4JEUXjeMs1=7Z-OYKp=M0wI{vCK;4n znR}3_aLfz+!*kWf#q!!#YbU;}=cJ*6r7#hJPXJB=Rx5#k5O=!869fifZVt>(VP5LzO8Ti-&yi@_}w`!KI*?aCwxRR!*0TP720p@&ACAY7 zXH~P7Im}g9OoE^ao?DfpOIua5ig4oblJ{hj;GhzArn~W25ml@i0}4i(ZLE(4)DMYzSW_=XyWdt5DsrR7Q4SbILi*0DoAgJqI9sgVjB? zFT>mm@1E`zFTJwbP5)RlGfmJ`?O7^^J9px=1X)mR;h`MxOC;4z)H)&;(}Y{v1I7Qq zG2TM*{zNtZL)oB#(SSQ<{hyf0KlFZ8nFYDPNIieI5yn)DYj6=U`3n=>@RL4G&StZ{V`CD7F z5-nOX=mt>3f94C331F}^@H80L+ro#lNww%zA%57)q?;hY#FjZow}jG9l_Ey}g-+s0 zw8kfxGx4aCo<*JGgW+_{AlVuL1p``%jzvsU1Ac)o_dZqji>%!3{XpzXON2@L!9C9z ztX9heUPxb5{9(q+daNuoM6N1J75oK!sT8T{xAuy(*xt6NteHL-_#iMLDnAx5usi&# z1q*c8&etJyE6yJP2kUP-}JJQyoOFv?tCJiCVsN zl`n(;>0|1g=J)D>WwK30eGjW-tv!(XKkNI}<+4G2A_r<}X&U!Lk_GtjgS+8DJ}=wY zV%Uzl4XS*(Tv&D5{y5AElw}9008?m{h>#(8=2wB#=oJX8!d_?C5B$v=tBOCZk*YSX zkhk^q>4hK=5+wZ%+(kon=^|HvuYu}x95LLmy%YQ$tI-pDcTyCS$%qZ$kgZ#`pUpv-xXa`RNtY8A;lJ= z;VuUEXR>xR{QzKZFMv-1)V0nBMsSv{ie8_|{91#&2E6Fl+GN6sUc#eAL%ks3eZTpc z%&Y#_7}O@{OB^b1#Dk8IgMeHs3v%J4;63nvw$+fbe?s9u zqDs~x4S=eLg91%2%W`{J4gj)fZC``gOjP_5*R&O@m-Pv?YpuMhgu2E%u%|g?H?%^n zTf}KygQdYsp=~5!w_Kbj9_FIfHav0mGXAPDjL(0J=UFH`sDAt{{~RL7SE*aZ^h#lL zrWWJ<8`f!M;imPnpemIG+Gt)>-zp9|NtcNFjulgBJ z`^A3F=dyCufbM!%99*PW)uPpr=yDnk;EhjyBL|WH z!5izvV;-EeIZ0`9qTSv4ek1){aF2=LA`O?d{Ura8^8dp1$|I?XCOS z<~N{)cX!5`CqTLw9}FyTN}#=YLX~Wn>9?|%3usAFLcT1IgB^Au3QV2py$61tsCQ!{ z2n<@YW|U=+|Kh9#^DvMt!Yspq_Ff>U-fje+5psE;0^qv(VY}=OfVKQmHouid;b(Lm zGOx)hp<~Q;%)%e7y%Dtg>1M&z0>CjQ==^}cgj;-&EsCj4($i*d8|kLp_$543Gu01Y z%68f~-HKUYkCc6QI^_|cdCO^?w9UO8{@WNiU2|FjSY_oCv`MW7?vORxvF|5@r$#x~D_Gvr77A43Mh5trxcD4NKu!CN1vVpx+kZ|^bz0$$Hj-fA4 zL|`FYl*3?_^uOB4zg`scp{4x=*SL zRR4WFg}ns*rLaG9ta@mtY~Og07l+7sqagLSAP+i``b_9T`h51U1Qzk7C_v!oPFcOK z?QMwC3x@kXXTucS$3j51Q`R8FLW4iX+^kydl3AI%18aaM#@lN!n>{|fOIB;ag7WS^B7vT^ zB8WUEome$?OYb$m=O8hN8W5do!QR$!1OSOAmhZt-@P!n>FK*}>@YyIeY`1KonZZc9 z9oFrZ&FUPFK?_?3!4yK~MLrB)rh5?((b|EI^Xs|m8Xj*|_iLGREgqrUjrIsE4`i3& zkxJo@V40z@0xjr(kK_(5mo3^ra5PiY^IywG)nRgE(=!TX)a_G7EA$q9_qA+Mbx=Mu zW+btKcB#sj8r0|kRlER7A8x@^Xuk*hMHZ+B_ef7u8g$tZ0F})_L};M&3yi>O>GXHJ zBDJaoOj3VVho>?Un$Z=^ijh1MNV|S(?nTDr0v*z|+tJDZ>R=%26UD=J01kWuGknk9awDoYIxTzJldR}1eJLB81HbEIaJ|@@|N9&@Zi6gz@yiDrP$lVv^6W#rpr5*7pFb#$ z2jjgo@kkyzC?1cALjeLzg_^ZbwnePq=sq13kK2#Lm%ggzekpQ&b|Bp|VZm@lJXWh2 z`?2Sg;eZ5a>Hv`K%=d)@@S99S%TpLz9v3`Zp{c)#914ZM^Uvepae9;xQGp18o`kJ7 z#9OM#0h!trsI7&h@2Z{~fQ8+la`9XRcQ zY^aL^g#9sz4pkS>Uw4dnB0C<#VchkNyxKcgi)v)b#vlVW#@`H*mCX>qy-j_LPOF7B z~)h9_DEKsjmIEk_eS8K3;zt1HwRn5`@xYYK>>Iwzi6fbN+WuTs(Dy8 z%~@*;;*f6bH-Eu5KXq7MSA7tJ&){ni0%UFf-(8Ki?Y6zS<#+kj0u?sEx(lo`ZXgXP;RH+w@}yLSEIj`*QcFMpdO_*Q0SZo}b7=$ZZM7BE)uAM$Q<1O7zlPCnC}(8t0qSLY3ej3+}CfWg?v4|0O7OHw%vn1Z!K*C_Sq3u7^RxP)}c94sy_qlQn9?-5(y z3oWVxxnw*zO$6Mmo(Q;}!ILPIHTf;K`+UI;W_!WFb(gP4Fn5E4N@df~;57t;?MJ(^ zn-&590>|xAw~gtQr0r@Pvgyx#!Q=pZo#>NDOG$I0Cn$RDV0NsQ3fd|K;>OYGWAaZz zz}K9pgV{J!n4;mZ8hupO&Ik);Q}8+9fAq#E=Q}b*9Xu-2z{r0+sw3LagR%Z$5$za+ zed`^Q4P$kx6wtkk^33a7vf8-Ms3)D2|i%}qb(@U{E64qrn#_s=65O)9~6-&b`wuEW>& z9G4A3!`C{$s^akVhsUKSmGVkQcBv-#L)Ryd1CxDeRum+G05#eKgVS8jXv!AqBKe>y z+2fV{0n2^zgoHcr6JNnQSKAnIw`j|k+?CI2M$ z7vnYQ=3*!?(7KJ{z$5U_Q7EVRZrNT25TF)KaNtKc48w`B;!-O9??XRz;)Ki;K2+o_ zy&nykBhX^K7I-aW&(cH5$i1SI3EBn4=M$g{zTU=C%pwL0V28)O)<_hbv}x-MU7x*w zl!YyHgqm?^rza6h=d%T&KxW}3@O&z#e#udvbhEp+R(*$etx(Hh^kE| z!Jg-;QzvD9)F7>AtISiVZ|D!HM*_Vft;Ii$$7G%Ps7w^$fm4+n!Van1JubJ`VLwe< z+A^TEB%iw)ib90Nd~Vopk?^pR5dF_;!IuKTx6-MT%iu64RI!3rd%@&SfPXJ8eCWv6vJf&zd!(=>*BC<@IF#QMvsm$dNOM$v!$holf#|_py3XJ(RVIK zJ^V9*U4zu~KT9hv2xztQXW6>0u?X-EWI<7qvUc=iUa(ta7&8itjQtzVVyn#>b?;dn z^u?`!my5jIAM|A@275^G4`|L68uZF!O$~?Mz6dzY=ZA<{qnx2flv83UIEJ zB7&q~VyOGNzUSvUt-Uz;ya5n-XzdlVAJ)zcfW}`lfa=Cx@ZVH!iLn>+?OCU>7ldEz zxmQNR9xwA}Izx!y3shKT&WYvV{eAu?1VgRI|2POBNSwn-jO}Km@B!%oSXOut!iP(k?p|F!J3f664bz~g#}>( z!J%UOhon9BgHP9y{Sf6bm=vDmqy#d&czdR9{Y&3QNgU3{ln(p;(l^qaDNjwny-9E3 zD0RRS%-Fs%A`g!BHTqeU2OqKSm%a^~7>6h7zft^PY?|v(oLC`KxLc>3=-Z-#Wc>{` z19A#qa|lUdQVj9hsiEUg7)v{V_KybIbc+H#7TK&Cb+2Yu{B`q^F9Vh1a0AZhYe%cL zv@v~pqVFBn&IztE#zj%zdB#PYPvAp%P$mlj$JO`=)75DezHO0H!bR9%gi(5d_Eip1 zaLK@=u+`vCVS991n2wmuPprZ?TA=Lm4=T^o$H-ee3}7FK>D~5;H_wcGtDr((ZmA#3 zep-+F?Vbk*^m($F=)hXisu6x34XW0%)bwX%Z(xxP z=Z`T1N8s@8DW%9kN&!$GYJEMF*2I}nm&H=M+0?fygjBAPB8K?1sJW*^|+8a zzhaO%RU#S406EFTdecfn`@r;6(K%smVHxm4hD{Fwnjllu3(-6xbuiW1rRfKYQq@aC znVsO7(10$|q5f06%76;>hIrMr!vr87WKsxq_$A8CqHPK3E1B%+>Dc8V4-?Zqn3&>WVybb4SaiNo;xy(&ozlWYSxrwwj$uEw5`H2d3BUn$pi^R< zrB!tzF!7=sJ#wPCdB9$CM>!gYiN-l2LiPi?XOhZkK>Zx3zcSahq_H)ov5ja<4@pvg zvL4erlT?=`yTo`G7X`q`fI%G|0lk15ZG~Npr9V4a6^JVDFzc&iRoV)1Hc?*MhNlk) zdV~Y5@LB@N%QF%*kb0zEkgRee3%>H*h0&WiL@>=Xsr(ZgK9HSNwH7+HNBPp7A-{IgdX{~pu*XQumyl6V}Tf6hb3g_D(yt>L)P7*-nQt;!VDwSXlYroIi$Yqhvnt^IqU zCNPp8AEV5C4me-c2+`8nU{uiY;&%ZF496D1a$rOZ*h9pa^q)teN;CdgfJD`e_dGb& znb185+fq_>*S&IC0H)O* zqyEthezG{x9C;lmc1<0_FVItLm1!N-^KI4AI-vL1s%a~U2o%DUfx$GrO5hU2ez2g? z267`L5NKTh90jC>W%~3?RWGn`h`umWwYccV6*(Y#UOW?Unvhu;G{N3Sqp^OPdF<26GgWc+96oj)u;0q72J{6tmK5lOELBcuR~OSoHADUb-EHuK zsdY(A@VJecS*k@FnHd)oNA&~%ENCY2XniZ00RpBWj(C9DB#bbMUFu+34YE~!;Zh zan>@+yuu785I;5nqTCefTk5OyF2fK?1;<~16G(*YtfR+*Geu($VAavrc(B4)m^k~_ z+Bu%9GU{q)%t!DGscL8J@3qsZpzd~lngrkas&+>IUOR8*)!ojd=kOSJRXZboubt$= zy4x8utVTP-ey^R!>eb!Oe_qU&)%D;!_;=cwn6ENA*Rfom*KFpV-&w62^HuuUbu{zF z80ein=)fjDIh&XUbg;JtX;cPQB6Dk*o|mug_+K%r)(ZUZm{oHH{%6eEvlN=SDvbD_ zF>CG?5VERvP6@Nx*Rck}w<8jEYz;O{t-c0iaqWG&N1?j+B=A=$d?Yv@Hg<|bt+VL@ z0p2A_kZkT+OK>viYPEHDQ4D!&wDY^5tJMxRW%$>|^t<4z)z(GDD&veg=2i`S4$lnB zS-lN!1A1tzM;5C{uLD*TS9$Qbs8|t8$W+T&ipw9kC?MgEZUr+0hpC%zdLn=wng4)u z2(fg=&rNsWwqftVnUM&i1>;6~S?|o!Rs)sOVRGz}&~zp%AUy$a~S*fco~!X91L7-)4W4aLv% zSps-W0R#lxzyyw*r!AD*gVRB2plh(qNl7-s_zBgI14|?91>Mmj*qW4O7~5~Tm5Xpf zIGrPYz*4Y8xOT7a%fIT3#HA*9pFYq~l@!d9aH2jp2rqgp0A`IK6?)apJ+hOANYqt( ziS8Uxr#Dz=l2me87+b37Zvqa_dJAX$$cQ>4uPQQ|r^v5rE$X)hflA)cN*W-c7&#}g zZ?DjysJbq3?AsDvP!Ei%!j3gZ*wTms5pR%2X;>@F&xCbk2K(uiQFX=DQ?nod#zo_N z{zKkr!$BP(%AEk7;Fal19 z>v;;SP)|=SB+drHeZYGjm>DN70~layFZmJ_VMw;CmShAKV3mj&0nhV&rhdJV8j>=J z(C1lplfJC6D(X~o0X9X<3amM$C797zwYjiQgf4P86obz5qkLa5XwHQVwCqQq*aihc zRLgZ?hVa5x2+Gqw0sB)ULa?lbcRwRd)IZLf%BT%kP;$Ki=Fs}S20oNfH;|3=CGhI1 zwYtL0n7B)^kaqQ(s?#fE`9Y29T7LQ$Vflrl#N+|bl@YM8!hAy`QuBLtjPQvEY7C2d z(b^=aQCVPH#7mnMY82Q}{e!HL=U5nU#zrYTY|@9Dsuqdwy;TSTbdxSBRUJAC`(fWA z%4^1CO>!6lE>LcN6;G;bznw>a8Nv(%gEkMtwA#1mhe}m62NDA?-pdg-6gl5}Iq|U^ zAz5CIHAmMkQ_Y)!PC<_=sxffygh>u*7tEn@VV6oIe9N~d=z(QWW6E)gCdM{Xx%$>- zDz#SMWK>Lc6g?a*Q)Rh+4@FR9o7N&|tyMEsnkXFMueT7E^)L_gnTf>`f_QYN|lkt)=Ql5MrN*91N7> ziIhqZ#xeE*3|c(V@y!MZ=eLBx@D}|J;7=?NJd@6azd^Gptz>0dwo-+}0{Az?a0*Qj zr&KFd(0s9|8L_h7QdHSU>k@A3>8`DfmgVDC>biQ;JVXQUj8eVrIl=-0)LevabLgo-T?MzVy$@QE?o@&S>%jpE zRrMfTWd{0n2zTJVpplUnZo$?sRtb3c`L4O@3Zy1booBR+`&%_0nI)U{3RnV|yNAZ= z?d?_D3Z~#ldjmj$fD<@(!70UchZ-G7XCH&z3-_&>bE5?8M~e$6vH)h-(EN%%6T#3T z@d~ZnfYQvA>SL`&`*10X#u=VXJammHf>Afc^!9xWxeRQU38rW2+lh0Cx)@0q}EY&4}fspX&x@%Q#o)`HDlc9GTlxrONjr!5E zlv6PyfP#z$ME(#loCvNUF*VhGGE100ZzRZYzIb6g6)?OBZy#!g%U);*P{mos9A3R( zMSO^heIVON>Vy-aF4h~)b)p~jBbzp2WC z+fi+9o^6LMJs}b?w2KQ1UbA>!?so^)!f!U_27W5F z$d`T81FH-4=>(U zA8Q2P1&F%Qb6|_;t1mrAopxnk9@_!?DzihdIeW^&4O>DJH1;Ti)5e(~<01N1@QmgV zcsuHMVPZo1rn9`M%ARzCa#a!?RD#G^xR@q!eUmQ&zI=QPTNQIn8c-7Mk7o(5D+j{& z()X6Ds}uI*K{fK0{-|8#HmUT%VAZ|(VtY>>dT||9l=9$qP9D#7_R~Wh)i`m<4mol3 zJV*7;tK5kzW9Fq30d&CL1C-L2cU5P2%Ru4k%b78(XSGB->c^nIbQ^RiRwCG9e6REa75mvgTn`)Uqs08eA2qTvV$zXrRNehrI z(l2&XEh?T!G@(A_try&t*!nX3wc%I61C{C-cvMdIZu2766ImOHZh?qR5jfmb*u$Gs zsYlftNIU{lV0)~|i>Bk?-7uLHGLjyTGX}ST4DE)GipjHl6F5x7jF=Sv9G0t46i7;*;5Bm%kDL!a%PGvacdgVipOB+B~B3sh$6(&~>crF2)VD*QuE=(fkJkaa=q$kXnXT zI6a`>0&T+cB~bRpVIC&7Jz~16fQMLgq3Tk|$8S9cN@(#y9-Gh*?cS)ag{+(=gwtc$ZBl zo=Ep6c6m~N#w#tMR=D9Mm7*(^vjUb~fNW}(Q-OFE!fkW>%t{0oWlmEHJ*PI(>*^lq zY!idsYuW6dMC>2x6c7mj16Y(-0$9NYe(F#uuH6@b9dO>*2k3w{y?TkNcQ!Y!@ycFJ zoJaE_nwgScLa%JLc3g;eqk(fQ0w4w$`>uzohts@i4>i-8tGDz}MR*48^B$_v`P;H2 z{D!%Hj7kyo8)vV`!iyW64lw6>XYe!e1O1O6wQ){Mg891)5?C3AzT#4Ke*NXcCQ!q{ zP+_ds8T{+qW+X!Tg-cbonlu`ozHv@YfBdrnPrk^D1vp)Ch=J1h)4`;Ft_=Ef!PDM` z$FY}G8JC3@!|Ga{Ldea)o4e>V?S=lZNa21nI!jm?SE4wQtOGxp4x zw>i1mo->>XU7=PCUrTy!KU!)IDeB8&Tdua84>Tv7g5?q2_s+g)Ix+U7S+IRB0BEtC2%(8~~AZ?w}5h2k6JNu)K4UPlGRa_2^ zYzDAzd4zj5K87whM#MpBo8I?lb=%*bt?ohQ9fqjY!S_#kzgoOQf2);9!+;3NRS$GX zy;uyF>xM%03n!Sb$d+@CfxF`Rwd;=u1oC>R9*KijWI3lpAJV@Uyj_PetO*X)D5X_7 zTy6Q(h}X2>49UW)K*PlyZR zf0h`Xa0FIw50@mp_BQ!f^LR?;IA46j#9n1+OMhc=v8Su?gN+VY^AjKM}V}!Gg(d^m+=L1%R51 ztF+w%ZzL%k#p_S#PCBNMl4lYQEYU<^Fn%8)?>p|G6vL(h`wNVkiu49p94iH#mpl-yx!bey={FzyRPmn5X~DCu zy~_nPHAlV;7S>u`G^jZWij(-yevYEVZ;s*&_y0DE%#%i;H@VQv-l4yBRnxXuJ}6Z! z@4{AWP>6b79WKc}TyhAO9# zu8_0)U=V&H0s4%<_ra%oo=)Nv$;Ra%cHW&gv;=gy2VsrGO%`3Wrjn8?Y6Kr|AVQ~L z5GSU@Iixex3I-g=U66lf=-Jn(Mm3L0iZYSLA)!mYupx?6IV`cocv#{Ghh>9nJ&p!) z%5Nz)M_;R2Wl#Z{>;RkL=0R=ehHKSX){PUdQ>E8Zw21LF-Zgb0jTrJt?^TI(QuEGx zHRhgy&&+LYo&rCQ2AIGYKX9FjChnV^?xaDPKL0uu=^@JzGhNvuOR?KQ6KE@;!X#+x z(h?8@ASz*29WfBy4@l~vgj|c-tBd-nlGN%9kiNK|D!|^slUKal7vk$?{ZykHula?XM&EWq$ts7pi%2Vfw z+W;=o@tx!W*Q?eAFSq9D8nA+{hM?MYy^1N zE{`XM9dC4)m0=|C3aL55!@uaxH>k!Z<91H#1SbhEhI6k#bghBsa$!pF91<(>oPz6Q z{lX0%Q|RG&aoq}h0ZcTcH-9#uzCQOxl?P_A_l?3V!mGG8v&cO#?nYHsV`K2Cf(ow~8SL&U3!k z3z?KiEw7i5=k;QPZw(3GD*80Tw@Pt3zPLB3lGr}I|0WfwIC-Cn1s#5svQP0YZ7Jn+ z)1&VpgV_m3g~JiM6*8*qAcG*FeTE8pr1!T}u~vz`Vzes%gTINuCUB?#kAQ(ZCKP2= zEt;e86t^brzW&yXuXAg{ncLr*;KJqz7aQA~E&8jb2#_MoR~-0$YWG^jb-?ZelHSxG zej}4DQ5Wfn{Z$7jfwuNn(OSD<+C3^t9aCh0ia^KY41jWdpuS~*%1;_CL8GeZI;@f> z>!_9vP|Ysz=(V@)xM%AY#~EcO4zI@ZCNE7^bb$i-F*4f>T{f_;gD6K290(&4#xZ!H z=)rL06zin}RYZies`1HFBDHmBDL1Ruez+AJ1P<}xMt#xEsx9Dg@6D*xiWjc>g%=Tc%Z_pB z_Vhft6ppnBg5k95t}rB1Do~8Dr|XS>R~_rknlHL)Tn)o9PCYuVXZN=^>H4>-rb+B% z4C?6aw8! z*4Wq4B;k4yjyN7|iT*7jK9L3nXp3HdTOGQBrm?qe#4i9R1>d$2EiN^8ll6JG*EkVs zs0kL`uDbccKd}xQ6Ihq@4|t^zqiBGw+AOeVTA>?qDo!k+`zy9No~t0H+7B1Qrn?6m zowIZ^UcAnPLf>*mEu@JT$MNETJs3``5_KESuW?Z1OWhFa?t9WR7T{h#2F`zQULu2+ znC!)}o0pS!!*abWl>TQhQH}i4%yTz8w9NDBD0sFh=*lGcKnoxc|HFW@6tEi(j z%h`M=(SaKT7VU6ab$~7~0NpXdax%GLvl#(am#scT@FSA zj|n)k@fM`4!04^~7-v5fHt8L^a?wj1niqpbycjHIA^Z>8IWsUVfEeXEXAtg>-J!b< zQVpA8#{&ZpBnADxlL(uTJ)8l-uyA1XEdP@pI!Hyccf;oewiATv#0o&5VOxs_sh0M0 zk0bC4B(rG&N-sd#Zw9H3nakmjK&p=BDTO0eMwfr7!b>Eu9T$_E4E>%U7F+i6RQQL7 z5eLP;yZe8`7Mhz6{tM1@&*{`V)!AJ(@-949Hr`nt=#O22N#Etk4l02k49Gb385Z;z0Z4KI=YtpO*~fMH zT`DIX*M(``4>;2n*7%0ahC5@iZ;IuJ?%*$%1AphxB2W2^k+SqG`M{87spJyorc$`R!e}aM&k`<5gA+oD!INjGHiu<6Q(y zQFr{eYSH5J_d<|L{dF~yCY>|^FDNR;J1hAFTX>g#;@_&l$qYn+-uG{n$P@are+w6p za<^((JdmzB=nalQJmX>V!;nvjr?~HKn5?$zm3OP0<{uT60Aam1T7FmKV4mWw<*;I2 z`{hUgUBi7KG{3q><#!0j0W7#jVUI2i?+RG)yhs4g(O~1afKbRHhrTpmcWa3{`ee4L z*oG24)hrHUm)Zk$=DjNC)VQc#_o|L(8jBh3a>B6yBL%ODbAuAp=xTerV-&2E7bY^Ne8m#oph=~naFdZ|HRi=i(?6U+GKpRN6vtF{5fuzfWST^dko4u#%D4J%b?_g~d6#0Zh^69p|vmG+j@Nra@Brrftg zkP>aJRC!Gvr`-zl<2MZ~#)47Xtl~Wj^Z&nDg}y(=tm0cyJRI{SjhJ0!b5IW)p;{&$ z-AJ+LCjI0HaL%sYJ5=4-asLkt<1an~3=I()U_Ve~jE`s@Wb{|1O~WSBGSIPZ+vet~ zmU+&A6UTXsh+nld2a$N1*L&$RZn!F2_k8^N1YJH{B^2ndwn5KXtCX2LMsUwSR49_Xh;_!UsBE%Y>#B3QEI;+gO*N@SfpWdcX+P zsy0$B8c_rC2?p{&EkP_A&tR#8&9$o-wc4F!{Z)G z^yWM9LDeOt7nq1Zcx|$kpzSAb&e44zRJpv3fBS=~eagdcP#G~9dpN_oMtf36*VO39RP>jhHgbTHEQs_9`T=JL@nqmU+0#ye+9~x^ zQKKhQ(ej=sl0Y)ht{Gy7t&JBJ6P?l9vYf6Abp!l_{A>MFzMR7^!9w;Pra^C2oP1sd z^Ar}GbymkgeVu=K=$0chX;Pa5=XQfnh>85ux0 zDmi4UxuU#WMcAPSb`tP>devRQ{udRtgMr(4_&q;`9)4&Q(nP%T!EP9?>{rv#4M<8K zjwNVBw>0|(ecRp}3ZVm*xDGDbCQ)vxA9QPz@U!RY&$3S`mC2Y?wFnyf=( zRg06D5zmFdw~G9Vws`Q^U)K#B8!IjZW#dFEEG}0yT?nWEh6}+tHF+5*5MU@N(r=E# zU9!6P8U6V4eD*Ch8pg6QAQ;!lGn`Q;4D z$#F(KlVg(aJeufaJD=bQ3laMl&d+x0JI`W8aL9laJs`s&K&7ZrvuPq3^L zRnznpzz>w%%^55iqBFJ1E;0_K)#{J^{FLf%t2FhEP*bh`>Lb5aKeu}Shv1MSSB!L5 zt-9bfi+i*>9m?rBT9r_BuT`h;u4JC)A}#6LCaDJP5pQP9tTYEm3W19!RwVcSw zZ7z^DH$XASHWvoO-?w_3m5-s#ZEymv*5=H|R9jq3a$f%!9(^abxlP)fhGk%zsp1A) zy~!qzqsb+>v{xuGsTE9 z>~P_je58`S)YKgnOfnn~GbbL%b<&-c;L;>{0x&?9ms+tt2bs2)TDC45DJ-s({2q$M zv{)an{+NxFKho_w2Wr#7e)4%t5lO$*ig!jZ+lNjiMvzlAf~^<vJXg%&O|M5`7}+x3d~uW}#D#z2Z9O!>PGg0zY#DQhBk479o`t1M_gC z3Swh@YH*Iz!1-llE}8*~On4_B&G@jJu(BSS@f#g?s2=is5PbMB`!{Qc{@)yvgQ5En zSo$^l@bTk_r2K{5At`@h_YBKJJ-@?ehBM`N`0_}O+wX8V>iHdB=X^3GuL`IY&NNIa zCsuUEdY%>jV0NzHVEjfGU=twJmbV&DFC(D*yyH8W=XEHC@Xw#lwRZ&huB!84?9T|^ zGT(x`A946&@(K|4ijXr6q#k!HoF6}?`Wl76kAKtA7?3jOy${q0nBqcubKeG*Yx;SE3LN%&;ksAoS3qPk0Oep2NZ@hLZ3(~}&I zIX1lc9qa5kvbGDqe@z1fPgb zup?~2g+qIaJ~9nK+6aWHM>24q#ePZ^Up5n9vTpaD^K^C&$!AFs0&rS7(_vYm8U-$7 z2qOIz=~z|fcPqrwXEFiMU+bes%{~BczZuL6;zI`~+3z0G%BR$2tv-quF)#w5)*f#~p@|OIxN&EM2N-Y3 zqB}wRUc7pMRqOn;Iv3`OilC5_J7YR7SDnnH{?Qk@NX@LniPrQ=sq$Bz~N=9g!FK~V&M4;rs#gj^U zc@!Y`;YafItw&nq>1&=*#pgV^CLecto#)5r<3^J+@<=`0oONa+1x$J9k$f(J1xm%2 zi=E+HlH}eqH^4WG>xD5Kz3ds)=kf#ZrZ{PU0B(zwL+MV9N97#cJZ2zZ;{*oa(SCMt zn+0PNta`Yj(A|ELT=~>hnXoe96Qnus(@(GJ8>g!?g2c?nr>mZUWl8#r>FTVcWglfZ z3({bHZSgEF;~myLo`wI&Q+oKbs!h(fAYgbNBPGSc1J@2h@H@k_e)Cz}6~-v&S_Mes zBkpRarzLv%v&jJBf^=cj(nrx&+hA47{%?jWhy_LyXx&1(Q-h7$N*7)(rad_izMTlU5Pa^BC}MF zV%C_rF`XG=(+!zx)Zmjt;EG1gQq82uN3Vx}rO38fDlc$ggFZA%HEl3@7H(et7{I+T zSo6WUVCVC_l8`ed}{7pU$PDo>N5? zwA;d?6qkAFg@sL($rRl|5d;%?eAoh!l(CDL@pTf+yZDtSF_M6hb#;&+k<774iJUpk zQjzm#FUi838QT=~5tm$=hECJ@$cBZ9pAo85Y+!gDD%E#r%(O@0)*SS1+hNK|6E@U5 zNsX{bkV^30h$RTZ%h?P?Xj%hJz%{)|#?2Yq50goR#G=Q{R;PEJ{IHI5$S`eqVg;D0{!v6{t~~(rs&rjL^Gt^%w8Wc`kX+MG1;XP3 zZUP)~sLvBP6y>Vc5doPya{z=b_PW1Zi6FjMC_o{I#iGZ6zd}Nm(UzA3RB|Jtyg_o5+FU5WlGzTR%6aIW^A_~f-;foh| zba>|w5HCgb|UH-b%qyT(a91@;d<%ZZNttG-7T58LS`I(QEUem zjR?3+QEZNW`pX5XRF-OFDkfg^g35117(IlP&?Lakf`!vZj@LI9%0gZBg1QUNSZ}=m zN3Cf({zcU;pUd{q`cy2Nx2W5^yNQ>-sPY7A(_iEI6K|T7J%Oq?j1auN0N%YAxUTd z8d#S$2ErzEcCz!31z~FQOIgld+>nsXx(IynvwScE~~?b9hE_3 zpdBg;9JTC~`lCha%VbvkF&01_~)mQYU z#p+p^#qua-an}-6e)-Z;Y{05vy&_N9hVdj`iUGR3g!kZs^<|{*#@jDi@E`$`9FfCH zAict{B(&bZiASd_RnhC^^#)K}>bG(JUrC=2%Yk={s3m|o5Q@Ic0%OTq5zuz>RNw^m z&lJ8v9HlU@l?cKsJwKfi+Yt~%u-GB{13hM`8d>@UNC~{x0Gw1B(Xc(K@kY`nA7kMI zZSj-!Ij<-;+bwOzAH{+i52(;p70jdAPeAjp z<+UYjCj31Q)Ekq$1n2_|e;L9$1pjF({WS*C{?HEW1Yt!3phIW~0EC}{Y*q(!(@B9( ze@vX(i&sBL_^(?IlD$(;U9RfogUX>io&hIMz(EfFAp_9vr#CN`&=Nl_SM6F=Eib76 z#I&%JRK4L!yj|xHBdo_w{Bx_eAY_PqfukGj5mllkFp-d6R_o7}{?>kv{!qYl*)$WQ zu^>tkI9z8$Px$&()wWw-K`CIEVJ zCvJL8HBMebvkj7C^@P{d^(iu4=*7`}aD}?4lq>l4&p2=pxfJ^lAWh^Nh6q($!V>@D zL~vXGSfQdqXOBH@fzD1@p^A%UT2VAzV?CW5TV(1F^t&rm_lx&}Q@kCZ+6$`?Lh`w##MSDiI`KdAb=62jhW|bVC>GuPuw~Te=P0{O$E7Fpn(EnU(MmTk? z;#;S$tyK?MPwPw8!FlM2zG)qVHY{XN7E(XFPIa~3(VN#nnX+9UT89wzPiGOq7U^@= zt8PVJqBI<}AQfS2lDZp__Z>ZTz3P)O3a)FAA+gG+^=+(de$i<%AdjXb_W3yk@|J`XGD zPy)c&o*4VtNa5v8;`40=3|%%s^>$SMb(3ly8B~HZ2qoz)8NmPeL}xPiQXXF+`-e3B z!X}lS(TChC3`%fwUKj+cuziy{r};<|RD>T_;v*Jc{2%$0Mq(-=c$o5QS-$gTb!El0 z6PailWRZs9M9h0GfJ1sfww=zEQPPGK3YJtod5xvX>rkA_i@2W&l;c8sxjbD!UCV$Q z6}UHs$j-cOiAR~Jy@@73XM{&XfSV$%>5MI^9FH3I+ycAJAU$}CYFg1N67DZCwt;B4 zp$fNodepJA$96y?YgjvJ4P?8I#Eu1?fSW+%nh02s#!~jFX`C48HOU)dDzST17>O&v zL@Sz&q?T=JQP&%A-dRwPfucNRK%j}u<8-^NP`r80tbMlPEu9}W>btk93lZ^Q%~sXR z+O3PXsdj-w8}$|2RI^s&5MhhFO}QL05xOG*tV>JHS2Fzcfi_=9>F2holKM4|O^_$! zR%L&r_iw`;lu^3)EmeppL6}Goh*|!YDl;jf>8)?6lB(3>Z>fS_Rqa*d7d*8q!VDRy z60|--q2-Cva6Z_sR^*Ve?2vx0!4D>IVOZpgs$w7L)VEbpJ`G4fPkStUSAdVuh6D)b zcXavNYNYJ)55`kwdi!nFJ?m4%B;xXcsnI}qY7v@mSEcqfn2bPt(r&n_a@THG=O)LR z)^oP2)2xwt_jZ`|M(g@J)Kr{WOLidDUw^kl{iS3S@ev5!`i|iNm z-S4P>q4+oNs5@m?Mqu_N=WUG!QdCdyz^qow=@iu73DEl?ct= z#P?LB`*J|E6|M@x0fojnsM6z{9p)QAH_N~q`-y*XWw3D07nx8x!Bfff=@v9@`ieOCll@{{n9T z6r)rh7X@5|pAD8v9>5s|Uk=VP!It;c@r0MY<9*erC)<0g`atkx5Wn#%I3_^UqccAK z0IOewA-($qhLn#_SUkL$Vj^7G@VO0gL+{sz-d9CQY~j5)d$>;Bg~(e>?Z%k(IlF*w zgY+%CRQ+c2tr9TvkX9q%Lh11{ln1K8O^2H|NxmIs8w+-+uB|v%%mM+;2v=?*`>9gj zPY<4CI8Nf6S=+Om2hu@x3wNv5xpl6JzIHeGhHLaayH$N)=EU9L7iQ^qcB>}gS*2lZ zA!IwX&}IMZSfrzS)Klq4q2P1ITTW+Zf2KWY@wPoG-b#K8j|aY)hwS%$xo?o=`MbG_EHSNaCt;oce_0U-3H0N1BWfD)J z^}ufaO<==vDhf^xG?jNu=HQ{;WF6_ zJ#L?Bm&A`F3hdsCH}8XtTEXPf0vu>@#OCq1P{(&jkY-;) z3oHRrA?Z~GfDA8cjt{bOBrc8iKmY>|cCm}qC=VPBrRJiJa}fR>V+F&`SrRlPTS~ow zfmF5mrr+igzfD>PtJ>UzHua&8@oe3UEVP`-mPf#~5jF+<8?+}D;VaaW2Atr9u}`P7 zB#b@YH+*@PU+_kJRVmAqN{f91yDFt14oNAJ=V`ckgLy402I%yhPgF~Rx2v0>$= zVg1fW3*1O#_ertNM9?pREV)V{VMEK%H{!a+MuW2V=iwU|3jZ6A68V-y#uHyhTSR=u z%0NG((GSQQz|tm$c$I}%8z|Cc9atW)fL1=y0B@C9ko!?ckKC^=`ol9oIIjI@GdSpO zM5ToR2JHtqKw2Xu^#F$kWqeisNaiy@tmNZ7J)lb4jNnHcsb&TN`vIh>moQP^!t*U$ zZEz+ZGZ&~s&ZJ{c>#z5!3(sJzB-AN~;|!P+yue`D4+t>h2u3CWM__qp?~os>2YjHK z=)W9L7X|ij*Yggjg23KVopDfg({CP7=j%TnR2MZDjgM@Sa6=5UuHzWX2%k-_Es%B@c#DL8iftlbAjI+SZz*%E{F(^p?@y^)w!{WpC zmwDVqD5AH0is+zUewvRZBgf=OJ6JiKg5+LdC)T|WsYn^exs%#BfFM<$`RNXDX)$RFK%E2@WESVm(QM`F`Sf3wMdfTJ|f+MsFDA^XiEXn>ZqoRiXjV z8ZZW-C~kaVoKdJHLDru7OqG{N7)k`8bTaV>qXb2e>cBVFKaTo3cvy96yb0!fstsZM zi>ED;O$_3duuwQE@q&}=Uv$62$|>6XLnaQdRYBTAC*zJMieQiwF%jf>#bNLn%k{y- zc*M`MewBoANFWF;pPx#^VD$~H>Ywr(HZ{%tzAH2*gN3+lj)pXn}<}O+&+}#oM?C(h5!tSP$f>A z1L9CqM3HeM%Q&V~7;plkkOyNNd*FEN&oUqvVQHmsniNJzL()#aY}FVgj-e^JKTe7+ ztX8zzz)eh!cwsxaGXsuRUno24MNxg=RYJmbG_DwI()WFVQ09Zeh+~KFIamoRl8)h+ z#EW{)7pma}SU|9r5c$pOCF1Ew31Ls;78GV&?cL@r%UI1{EDRI4xwOVzL* z=#mxd33u{Q_aNRV)ZM>?rs5a5(g)(?L?CGBoFRKl_8YJBVA!k! zPmdc+E(r`dN$9ar2s=Xxc^#R;N4&y1`-p0N5q&wUfM7rBfq)*Lj~0btp9BC7(3eEe zqf6ENkqt{ePeOskay|NpIs;F#y>>(`ihn3R9In)>x?fNT-<5Iw|B|Oy=5>$P^N*@} zeQrb@D*2)W`W!?1s>0kw27u0;M4T=JJg~WNlyNH01RZ%cQ=C+|cINXE9XSRui+&No&k^raen%l{w>$C1^>JWI^alm3IhyTlgD?vKxca@T;I%r6h&wwkj_|KPQCDJ z)uCb+ydL|f2jc=%DOk>@OVdC%|Z+FJV0OtBuEGdgC#fb&f~M{pNV2vOvZx z9GU6WAQJX!z3xA%Yi6$!;E++rK>gbS53lBar~X*5V|bpEVD~3>P6|RY#Wo{egs`NQ z->K{?@3*659N<-JMdJccL^|V!=ZPWENiap@op=2&-+Hy<9W-kSp;2iN?^@yJKhG%p zetqaWH9zoHsebHxbyo9UCD@VPz##iJFM;>I*q$)M#E=|#4!dt09Jb~XGvuFFWoYyY*# zRac+Suwd6k-Td~6anAlxaHGTT(UIo&=Mm<2g!eoC0h69H-25&Xrl0sxH8%vWWJ1Fm zlHsuT{H-_8Loe+oRlmX~F>*=ACo#h3LB?QNQ|=x*)K>RLB2UwS$uU z?Ehl)8Ty9*s>-%&AQjgGv9AEA;N>;gf`%V^AJM0_1RQ1-dznIgF{}fny8h3qLDDa! zptlw9YI-W_woHc%4Eb&KK{yrQ@!`dH{j9=P5|g9wNU~6@B zJf!m&a~r`p{(!5iInEduAuWfQE0C!pC!i0>(C3{{*Cz4f+x$4^gu10-$)Q3gMCU@_ zWYGEVr-gXt-B0N+s;9m~9!rw7lMW`E4)_>4hMow~2Q9q6G}p8s6UQ)~Fr~h$DrIWJ zMu(BaJ3k|1!c@0`jB6wqlnHCxc9`CTpIk@2y-ud3o8|r&3Y~KTZoYg3v(j5%6L4Ed z>MN!m3Ah(p@9W(Gx1oIeo*x52w}Yha4m zQr$D;Dzq^-j0B6KD#w|^9s^H#MjxzI`5P}u@u6VZu_nIfi zyB($aVOHN8@3xcFai;1gxNXm7V}mg~XPtP22{a!QcsTE{4>3l|*U#a^kHVkuYXb&W zxIe*dE~xM>Q+dRk65HI&FvzoZlJ8udCoD$#@(k` zI8Q*MQ{@f%fOBG@?eOH;Lz@?N6rKftr|J8$ z-P5i8dS15MGO(+;-jnUN2<&XGlXLLq+`Kr1i5oZnr|H1Q;8y(z=MdB$ClTS`2=Z?_>7T!Cd!lOX-SS*TK)KT(_UqYjNW| z_d_cZ8>IvqgfvMPGt3n-7=^Tvx>3H{@6S3Q(y%jWM}6sbYe0rUo)K{SIfDkrNPSW? zA#3&Jx+OplXxgZ2g`*8_A`1?fk%yAra#S!0=G5FA1!bj z7tQwCn`(Sb96!ARY2CWez0CSb55|v>j-9Bz_`O2+(SRhMf{|O_-oRCodLF68?>2BR zve0%Ug5}y*s(VD-OZht`;tpztn`w0({lubQJIp)4#{PH|gzVizpg$m1i+4xeG)t2I zC22ic;*LOvcQtayHe{Kp#yq#{-7Kes>ckXWY=(n5_R2I}))=EYSgQZj*!?@|tZnSh z&0?J$6#Wt%uZ|wp#66uS+oC3JIS9pfP23esE^g}HWewJ6l)7zlpMdyuDeSft@PK8I zdEoGerTWfNw*lLqRO+6d^z};U2XSudt)*@&Sg4Pex-Y?f?1eJ-%6wL*=Twd}1P5}Q z!$E8$T`q3s4wbom#?-84pj5r|(Pr)@`M42&vWwR=cRP9W=L1EFE#2m|sNnS=fG@Rl z8%Z6gE_&+^TDn((@}1er9gd&nt=vm6ujJF*JEh1cEHd&m_q+;@;|Z)IHYMVr*^$)h zBrnw`d8t0h!`7vinj3jPWfRbYGAD35p6%nG%SFWtA1dCgjlxCK&_T=?bdWtggPxqz zqcG*eQ4J?R+Tu%2cN<%|-Sr; zR)KRAK|lKpw^0Bza_bpxgIt*$zOpoy48u+Wtqinrn}m}wb|?)#D-9pkWo@uK{-%4k zanI&0jqz>Vv%m^&YU4HlEBJXEw|$#wD{*DU=Hsm~bfy=N=>G6h9QZ*PF2rdMze&*q zP{lvCbw^fAIFRoo+V6lG2t^GTf1@e*npE{QWWJ8X*KpO>B=hyt{WV$;7vX^O1HQ&r zm5rFPd+{~7>g&q53iJIJd{3$RKG<`6T355_!QSXztM%C%-VuDRHt4}ga4)98a_OO5 zcyPR9rBUUJ!-UG6P=DSVurAQ=w{wfFWBU7cZX^U%SE+8&-n|X@sN1_w0cAU$iNznT zuRhalSpLaNS<~ku4TTlXohyMB{ud~yL|@j_S#3EmWU*c)xyo111dGNL z)H+~(kg~G%cW1hHcV4rYm!Gd09 zs-An6Tila*2gyj*$o!%d3Ktv?#;YtOYWYI}=Wv{JcxjgNN-oPY$Qcbaz85?G#!GX$ zpabAAT95AFHYuHj06(S)ks&5wd*SfLIPHgw$twW=Sm5o>4sMyXOj{jYox~0vCcaPW z=r#%Ldr+_M2tqV%wEncC+YXFm(b;ZqDKvqF?mgQbDXA$;rFR08$p+>!_18{rCrQ1? z)a*{~(~{c4)Rmpx)1V(8+SzTC*Pl2HSRDhqh&iG<95{RH<(=L3fgf}AH=W%!u#sYy zd2GT_@(XmYk}7XoQsrk>xwwnlR{9u5{&08~w|Va7QorDE)ApmxTGPcnD}NJ|M}}~s zXD@d$bF;g;=SefOnYyN{d!eLWU}}C>HzKJGOug6DJzr8=nQDBFdjSlT1J1z_!)ff~ z$2sS?ZW2Y>?Qo{nndNS!_2%M7%iT#Z^_IyRO>Dg7T=(1<1X0b)!}E&0^}2K2?%jOoR^?6gn#5JkGXpDemya6dr9)Gs zKR9O5Pt+Ma%%s0ZTKDYcev{2PjLyd4mgMlyhqECa{P{d#!6%>Ro@m35tC6kVRy!vVk|>roF*wk)CNUFhbez!Vn1m4H;cm;Um6kYyIyoMR7P{MQTI zpq0<$=h7^__p+spFWC2x?%3kJ^vv$=K^fbq9P}NQ{0DQ8KkY*IY;a+_`IB@UF9%KK z5np_erFyQ{<f&hu`0O)EItMg|FQLxD zZs$6Hb7%ucRdc${4>*q^0vj6q0S)>@29M2R*P{j)NN|0LI9AE@@z9VB@rl_G9|8He zu)zrKI>4PaSm3mfd^nC0IVnP6#{SNG($t!PZRE5e-{1C9_d$Sn#iefjb6I{rk8&Jz zP8)QMKY%+3u%6+?=U`+pJi0WTXsEqY;RnDVXaSt z{l}EQ-^^E_mo#e|ovwrY)PF z%;qswSz9yU2TWtrV>#hy3E_@zA#VQBt)J#K)JWoe>f8V5_LQDp&OlFZ{L$?%KwOTL zEH40L2;YhfiHid3tY?|eaSq4UXf-PjxWX;KlHY%Ydqx^Zw_e&HGOW1*lx@8ZU+Ipy zk~y;=$`Tkjk&hy(MOk351v3vl2B1b{fw?Ip6wD>E59Tw;$oXnNkH!h)szY??;s+=v z0gJ(7Xb%j67$u8a~9qB!9Si~n^* z?5n(mW6#kW{){cpLG7eC{smG+uL9ykfzzXM>|&s!abXP82-&ad##e!`EYlZV<=$Md z?YoKb(3oQfLC!mfyTcT`k|1;))Z4Cd%ca>5*ld0;x73=sxV)E}YC+8D(c5j1t||P19u@&%AfSEkxA&MdV8Q4i>i8SZ@2J|Y)B);%BiFu;2-ct zuxM+x0Y*tc9hgFb0{SVYAUaEiG6%V-fpQzK@0ws?_H=Asc+7R~Ku)4{%O^iqysdbO#Tkzh;UmEm6*$Lw0gc^{00^IME6dRJe!Jw$g~c?`!ve*Bwq2L`qc)$b{{dEo7# zI_P@T`2A1-*qnx4m+_|FLK@9ojHgj{va$89N6^{x{{F&CmB~9Bzz!G z4?3@y-Sh)Hy!dLjFcmMfi$@Uv_k_OfYBwj9ZC2tQ5Wu%ykGt9}Nq$(~#RZAf&NXg> zvDBH9fuR9?`ZeyEiTqfGrUzc*=AXkvE8q{^&JmfIs|8;%P&k6d z!rSno0pJG-y$jP2bY7sktk(gJync-v#kM_gjayQ{K|O2+H8BKGgMy2+X;0MAYu$du zo68Kmar_XSFw+;!OsAoeo^~yCBr`+AV}TJbI8>MoPPY(ValO`U(ukeBkMdNUCh#O< zQ!|2iOhuM%J$Fir>)b-wH^-T}^g6e`q$aVOzhCF(^QCZ$F>>SiPb#he;mYQEJ^4Df zmlXVh1%JNIy-HI5VXALGh-O<$_27PPxjp&tM8HKNRwghmu-?|sy+erkXxtuvKGUmA|D_TY!j=t%7k4i0NW23KkTNWP%?^?4Ri1!@M zS{8XniXgQGDbe31!Plh%Tp~C$ZrxeB!42-2`8vrzl0S=)`vYuX;0aL=QaSdrkRyH$^cZ>jc%UI_uDk^R}F7;i*q@e?@S#~cuWZW_F8=Tjcz^b ziVdZdO(Am#%V4@WWN>O+x^zQY7^TT?9g0dxiX+~LfX8foqA5yI7+A3EukJf?n;19J z#6zuC`-Y!*sj7K8!lx1@HOGN>dD!?XC>W7_fYU3+W>mrHHIolE1K_x+1a1mv1}5u_ zzq#2J&tSm##wYFPgk(R(fx-)eSFT>9HH-4_%u&H)!%K^guwg& zosd%znbNSg_F*~~$;UF_<2U`?&S(2W+h9=PXEGUvv!WV|$`h{zU<_v9p+O}Az3aaX zaOao(vM|eOK((*97q;=-B>6S!<1Y3!?wFMibQ`p!FVv$Yeg;IyNs!IqWNqJCS~9{!7@{-mkBxh)}r0d^qiaBt06pwZvh#Yl~p~AXZ^b|R4-@AEpBPn(RfTEP-7CuZgKyF z4!Zx{y*qtS37>m_Yh!98-R`fq{oUCO^F9<|2pU{;7VAgdD>#SMNEG%QF54DWC==Zl#Fu^@NSd6+{ghVSrk zM$-?eQmS1TDhu51@dt#*HxN2Sm@OPaJpx`pRPf{-ZdC2l0?Q0=#g6xP3ednTKFlN7B{Jcr zm@g90R$=y~CSgEXW)cQw&6tof%>lfkK@g$2gXd!h>&ijy=|+USn^Ya`Vx@ukVTYT) z4a#pCP*cbg8HitkuTW2PxzoJ@A=<~?3A51}{py`=1Qw|e?sSVPSmSw%e#`K4 z9}G7%K^rJ7hgl^_00)E%Y4rua%&=-@7RJihL(8J#>&5 zJrEhncV3pqF-4{`$Jrw!m^J9P2`T6yY!gJHClcj2Ur8>h|Iav~xXs{~1zu&__NSA<7p=w_cf0w4U8VXDce{s* zq1=qex$m4f!E3!F5OGm5xX{Hw-`VpXw>k8kci-do6{bhbT_4=zHY+mq;;Pq+SQoG- zRBLpv+aJ{)zSr$W?dA4+Avw>`1^2m63Jd-q)F>2&;T0y*ap(RriS74!n#&0^NTgS| z#o4`BVjyJFK>w)N`M%55T`Sy3U`wgKw!$r>ZuZ^^=xEXD^a|0(O|b{aQyL!I;qkv32wt5tt#PRK)_C8PuEtu({U)o4{-;FzRN91)^ELP=jy3L zTpM5K<11Bb6jwp4k{F^i&VIL4pF7n3XZpLPX;7OcAx=>uWuY}g-L6(29USJq)d|kk zU>hh*hTsJZ1s`Veb5M-IA&G8X{U*Q!;kl{hdWrhdjNzhpdSbYHT42vm{pN6YEOZj; zez$XE+fc^-!v$Wd9>64cN%4gXI1u=j-0!w(yu_1tqmydEk zjSNDh95Y)dz}ZIl;5rVjSe@4&boID814>7<1*e zm+Chka_>B2dnqj;29$tjQVg0KO(BH80I9$(LvfZ*~D_>W5#8~0xJssK_U==#spzc1lU<-l}!=|DB|N-L@nUA z)wa-Pi3u$2fwSTFHKsiysY!z*Vc-(eZz>Dy3rU%cHcpn@@t)d$GgDp0!+E5azHPkQ zr0YtAJpkcAd`hrG(qSA14xYN|GmTm7Z5KuXLm?;*Q@fecJI1?RM7#10hC;j!*)u~W zU{v3WjuR2YT42@Pi4m}@4$>iCQvJHc%qhUS631nRUIR>A#J5dZ%3~<{y(f>MtlT&^0*@ihh$zD;U^> zSivnQD1up&LFp3BO>+1w2##U^( zUzL1_6Oq2wXNisE*Q&fxRV9*;Zm)s!?Zs$4;6xy++&sz6FC<{zt||q#rb=ruZ4#t- zyudRuXdlneuT6rB*)FMd9&3G!S`i80gZJmC#i(!wgY+XxT?l{lw}*neqRynoR30(- zeHeB1UmkPYcJ`30&Qkx8afNa1BLP^$QOlf1W)qQY@Re^r=02E!BLvy{FOR$DLKi!O zKg0BAkGn&WLUvijrHL9Y;GuWuFC z&Vi90Dn?8w!CphD9l)!qw1JJjHwB;>ssA&@J+tN3=7zfjF$>@!Bwz=QprCy?1FWN| zX*SnRR=jE|PSqj$Uj96!pPBmqSbGmRDU0NNeA33*@Um=XcbQ$nE=$gcfV?Uv3MwW9 zbo#}B0nB)Y^Uht&2@Vx#R3r!@ARs8RAc~*}sHlh_D2kwn9wt!10OJ37s^52J7QOr3 zefNLfhn?=XV|8_Pbyam$w56=#SNKMXAjVH5KUn;oQz50@SE-YyMSFw9o;VFRqx1Es zY0-g!k1F-@Y0=|=t-nl*URr#JXD25x9!#MK@bPbL$of4`|808oteO~vcvZzkC&^j? zk18YW)GO_WcIMzh#XSbc0X%jYJ`Bh1z2ZI(SPvKs>EOK$I`}=$^R>sYugJliv=mRlRTb0~>3if> z5u^+Rsi{&sgo}63+RjO^0|v!I`E;~l>OcmRR1D8dkO3hUG9 zF+uA-?iTzLgtsDKEN85RPbPWmgRX_cN4P%$7!Go7GWecs zH#1t*4Gjj^Y8t4JEP+&gHh`VNkiqz33FZDYhVj2}Uq3K2T70hTM|^Nk%iDl}Lbkz7 zWa7-p05+qaOb8=A_JwCayrsLPf=J%nQ+y6I)dBt6%;>nxNBLsL4slmmAL_}oU?*Cu zzn>ND9oSY`*YU~dGr{)K|BRshqhSHYQtQmOJU%;}-UwjF*Bd^~iOyo)uCwPxyQR;q z4BsCN;MvQqdgD#U5-$SCYMIrdm(Z@X< zZJTwVlC50<9(H;Vu2lZ^baW8x?B9GkdSdu|**&JCo%5o3HM6&aqq2r$Jb1@`)N>rp z3T%#bPgc1PpW#vw7i<1X9VHg);Ya*3a`p`s>XZ^*(DpTgdj>IuYX@|8Gpdfx=-_75 zxJAUC3)gux4t9TEBY<;U3I1`Xf(;*tHNm-6!NEYi4Er`1)xgTZHAT20{AB!>J3Rog)byCd}9`4dJc( z2)%znv@9|X_JGC+E#I0}5^jT4MpN)F!;6IVO{H$XFq$9uu2P@0FgjUZ`%JXB;F}$g zv%}gO+Z~%Kgxwy*<{Sd=eNlY^Om9FvL-yKDjqGf^CjmVO+3zPN7J)m=^u9cWM821J z=e0C`(SKhQtsXQthc|1uEDKPP&pzK2U!B}Fl8ar*+;=25Tuy`2G|AZ%B5x25kFWRm zLw~a{T7C?l`U11?U}6*wRqyE)WxALzQP$omuYLKm0wlec35^1W5T{nDCh*S*=-?BP zxUb%`DB8MkECnaP4w*>=zW_d*7SHHbi=$1-<|61W5EC#+VDW7?^z$Np;o@j3$cP?T z9BrM&h6sHWMQA$x+G6a-xp3*p9B|}lVA8YEN$1Qr&IxejTJVd_lN-e+(WH|VdPjdlnux>J`v7d^TC^vxRj0-pLoanA#9 z86z=iipf%l|9};&P|D?IXm7krPkb(VRr^)Hn^OEto*bdE?44+cHIWDMk4)ZX0@vI7 zexIW|Es5Tm^wtLj*6;ezl4wzSfKQt@uP8)%+mdKm(q8$APi0B>yvrP!7ZR9`h0eo%6Ee3?ZOE|Cs6#P%-L=Dfi$X^ZuV=sY>ZBZq!O4uZHIslVX zNW}Exb>zVFnBU2I(DLY}QS7x= zP7T=gVFo!kYll$LPu{b(76zC=Bea)^qY?HDaHZ9X&ygWh^#PjT2CbQ%H8|s$j6DuSv=*2K)$eDu@Z)><4b@bxjM45*mmhm z#R5C}xmO;O+?^+!lT*fJ^pmdb_IxHpN z@`-`VN>1$8)!0jObmc42UY&$266dftaK+v1`Uk0%3l`gX2h0&$36z6of{z-jC%zJ0 zEl`?9>rC}(^qfi-e3C|H*nqSW0H0-E>->h;>!#;rxqs@yyfQNQ?lN2mRKTB|^ zp`Ug9p7utxRl(LuvA6+Df5SN>AH_)YtCf8$9Enw*(jj3@K9M?)rV zh~9V3ND!hRjGY!if)x=34Nz(xlr;l!GsCMoip22;V1&BPHaC|NEU!+OC$810Z&0t z5LN{S;%@LXdZyHf6{tF7@m~tTa-8vYG`|3>JI9sy@d!WO`gXLi0Oip?onB_x8%&G+ ztzRqk0(=y~>pev%`qtag;(VwU0yIj=MO(=>MB{~#T(BX(y&WxqKfdC3q9^!&((0Y) zGXIylU?U#B4bcy5gsf|_erY2t>yPLI8>5^2tMvMJLAgfiU*CF( z-=RO;6di0a^Fw6f5Dridp!>cDiQZU!{d+Kko~a*y4~O_zz3#o}`IW!q^~(gFLdJI) zsr4!t>YB^(48L7xkn16O$T($lw5pmY@CZGG7@IzL?|?xhU5)|`P=2++gXt_kWizJF z^3N7Q?)>8B=*9@G;c&u%Z9U%CJ+Kj{5cYYB7|D$ZlIqOg5*>y)r@SBSBUL|PL#MtU zwc9^%M7&-_e18EOAo>ZQ1I9c7=ejUK)9=z0Q=UXe22dEh^gf>TeV})~k7JjE*w2;< zw?;eW(dl}<(H`a}wKdwKf(7rO_nnR0ybyyCC{QSc1iN41GA`R1Eg8Uai?9(46u@`D z?F+Yow;3Nw{02OhZ_^Dd`O1a$NXWuqnwoCIv!NUG)!U+%8fej;a>q7c!h^cvgJ@NA zVxnl0IGBn6A-5hOo-wRs!BS|GM$}#PK{U;ux)YiK++07TA4e-C(Gv;#<7h$dNLlCkF(d3( zpnt8q;^XK5f97O=W+|9i_*ZUfy`k6ah(76mU61?(vijHS!aJj9`ZH&e4WPkA5^zS3 z+!bBYiy8!496$tti!PO4!ARqgR8<*`gmnu&{$Q+kfXjgO3h*rUrEb`#uvd$=Ss(FOkXbsv5aP4yQ6 zCLp0;wxkTE0X-o3qc`-SFQc6r4Xa3@=M&@B1qav%y3fC&&&uoY$q*r8;*g!;D-E4O zd!x5BlgstOfc>do7Ji|~8Hq>eg#}?{t)JKnO#|_BIq_)YUYKmnhU1s$L}30*czXh zf>Oho3?7itYB`8yHk)%i&Ps6WpMD)3E*0-5J95f5(Seeh#MIPpqR(J4PWv|cd~^25 zv5;wpn%F&qv9-Wuv8Oj#q4K+Exlq=3@_@X9zKfojzgDiEx%N8&5+Ne?b|`7|vhSj0 z1DN`hPfFUu)Hh(HG{C}jl{nu-p^D}KQ#QX5%@d;8*q}J+*MbgUUN{!G7Bo;U-v@|3 zqr2~mHZ26{b4lf4>6HzPgCTp}Rr_EgE%Td3L-~L1j~2&F!(FupYGg`}vsvP`{V+^o z_4%}e?^N!GEXi5^qlEIfs?f|iP#n(VV2Os{6_eNF=LyID^`U6Q3y!h-5c$Z*bW;*E*D#X)=_)}2Qbl2 zvJe_O2wahoO!XvZI4x+y{)-*F79Xt7t_@vh*CvDM<#OuUgLpa4G8;Lhl%Jy4OX^E# zoAm8JMO#SfTc#HM1j{g%{E?~6KSle>;D1F*Fpt;@lVH~v8Gh3<% zGJt{IG=Yi|`OV`LW`?u_TlaIcoeX~-%Ie>Kj$SFlUoKR-93aQmIeG$y=frTPP*=x} zR!VWw9?(tBz_GVpj=*a_AZV;uQn_MGsJdJaH&`b`9>E zo+RH@gV0_L=190pntLT+1Nbm4+5uihMdiU<26kaNN-;#>FH|4o12m)@0-zvol_HGy zfpelGU``&NgbYHu?-+#(q&F1r-yzbQ0MW8WE|So^7!g00C@7+LE-khCHR1A(=+wKg zb_84NrMq-_1j6RS(c7w_UOkFXJud21f@&W2wpl5-c`ebkzeV!}?$3Dn0olTa ztWx#vs(?b){%pBFS?}rBegnI?U#A_3wi58Kr#_+Qk!V@XtM0`|Y~8u%(ecA(0XIqq zVr3^R7kte{gszyq;}I5AaObl%UIAPYZBOBb*@hJ-YTb^1C|gJ&5g!C~4K=61u-d&ZqEx`e1Cv={cH}ek4e0|QUvKP zF+GSuym^e;fwSQE-KIi-awrmG7!u6XkNu9f82ow{h)~@}zvIm6E{c|VU3xnbWoY5U z@*5jjBiMaBrF;5SaT#@{z;zg9(^7*%3B=)Jg=wOZxz4ZtGCZaN6qD9m`%sJz;d?zE z!=7cRS^o+jF+c)-c;9@u{Qgo2b-&rxXyGFRyxYh>6$aD@K0K%is8)ePd3s(zZEVUx zEFnMDiDXU0t^x~R1qmkrBA|GYO{@;8UVT|*b^R(a&cqJdxCerbh8w~PG)Mt} zOvMG(dbZL#qza*$9UM|krRjH>`Hzt5(Unbu*Tco$H5Q2jfp$6q1dI|0#w`ho3V!D{ zy*H#f)x1+Jd-@EN={>%S+f zrfFnC%*|$2va-Y5D_z4+*!=BFR^JJ5cG7g|ixgGeXb8m1ke6hPgzf-m36vuhsmkE# zG8VchRT%-+uat(hNmET=mIu#`IDF)!1J(6gPwQc6>M1dl!}4HmFqESrZ3}Eo)7AA^ zTWBb^2a%%QM*zK{dQ!T2gO+Uo)zi9llmUUw5DA5|F^Hr<*T=kuUSU6e6+6OTcfGJ?A!keU{n)ae`>_9+MQ zaJz-~&oPZvepj48qHciw`T;+bPt??{61P+1fBG2wQ>q-dKmdFEk4$5K;FaHo#;Rx} z9>sx5%4K=k3i8f`=JDtd5CCLT?OQEfB6383urGF-gcL}|kBlqq@pvS6VZLf^ zh!w{=E?-qb+O{-bmF42p6-5jmHHsy9lC@2LnXk&*n9~aIPQqruJG$xla*}eVi#ysN zcX$R^E|`t!t_7;H3#b38H@pD!84@{>=Up3k5{3FDHfO`!y~)9hFHrZ((DpFZtWb5A z)b~tXSg0=Xuc&*yP_^}o1^E*AFw;khRBzn(dljp8c@x~5CKfD3aB~U_m~~CDI;MCS z$gF337+=r%{JyDJwZb+%T&$}6Fi2`qqR!76Ql8_Isn6&={GTQ2n0(KICSLs@tM4dL z5s>NMQLXD<;V(oZic)4R@8V+^q5#&(HPOVkLxu=GgpYcBsTwB7#Um_Q<(34jVUZue zt`sWH_g}b;gPzkbIFHFTGR4^xchPjex=c}cI;~9Q)10`jOdYD&Sc%3Ubfb|zOnSg* zzQ&U+B5Ith+ZX(HRk`XfsrjT7E6Y_=$YFPst9F4Sc{-~?MTFaV zvViBA*{SYH;vTaJa&%A;j0^(ybl2>2evBzx2xI`x0zdJds|`mDiAoZ2?Fgj35S%i< z3OQ8>KLS~`(Yav0h%JvdBxv>stZQt-CiOJ74(N>KF7R4}l*Y7Hp2tsmSA{C`KRT(I z`X+;@{;vYwQz3f)rJ3s8`!Iy}Am|8FHxoN!Anszxo^P6$1;;Xn8gD~7i^`jr;yw6wWWhyyBWsV0e1 zXaVH+KqpaKrU~*aMve^nt(K}6V$!5nsv$g1D%Ei`*qT+T+UI;!$z$Fh-sSg^oOTNg z*B9Ip&DWEvRMVmlvl;!8M7cH}(Mgiwn}CN1Y-QfAQu(lz`MgT?DuWdb_JsQdH4v;X zAwwV6N)^|@)})>jNUop-e2l=`Hy}x3;jk*wdH6)k{)6lQg>Qh(G+olo1Jp4IBcpgCoq2-?uP z5(oG=N3UtCmd8H8D2N|EpsaO#JJq|Z5DhtA1rKyaA@phT7FSkOuQa;0>Tz0>|9&yofTNwO1`#x^_X`0#^Xf@W5j@(XAT} zr&RkLslL;P>bhMA)wbxLl7R?}UVHYceZX+*34MJB)w#vKaT1nDtPkuTy#y{X{7vM+ zaXn6N=%9vy22^%bt&dqevj}5h@JBAj2C%f)dLcMN1=HTyi%>bwnY92cp%~j)ik1cBYa*13@$DYiaYx=JF8}u zcf<66_AQ{TAh|GSA=zgQsQr6Up^WQu3M^WtbXNWR_vlYMtFyDciM+g{5HxJKJ~B64 zsNWvmCoLz4C8p%cXPqava7^l^F6#JB8M5BgJq3N?e3P(=OMI>+yV(~mLN@H6Jhc0y ztLo6`i8o5^AL^lLq?;NL__SJI*-dr-1B!0#=A!5#B6@On@Iq|vd8WE_SKTB9;|sWh z>#q7V<+oqN8?2y2xR@gd$q4Y;?NR+schx3H6h4B|;l1xB0aP&iN35HZdZ^NrN4N15 z7_LY4P@mTP_ERH}<7I&i1ogrt1T1wQI3^1SNi7#wi~%k=3LpZ66iDq8h{Os=b*?rF zAQ*&KphK(xojC@$&?ta=hZL~-1aLe^7d7R!X#yCG5{MMxl^AqX6WlW>fv68sqOcG4 znKw++1h*MVi1Qpw1SPJCl`zBDXG(z0k~SiJ0(wAC6%L#F+~v#k1wB<^jVV5!83Bfi zkm6N+@bo*@qNy|86oEF>E3znF#I&-=6oIoqDbk@&U{$=x!2!M@T!2$~smx8(=ban!?z7-t^}`TZ9G0NFkyQ*zb=iqSt-0mM6kR6;k^ipT! z?OZJZCL+EjIO1(Lr61fgxJ>`67dXnx^|cRQQLg*&%r^G{>qxzE+Zm<%9;aHQ-%&-&2!@H!r}R}{1Rg2*qr2Zz^vAYJ zNn1e&!JrS1>u+rEyO-G2&t!Pe@T29#8{hoj~RPn}guF6V;iW##UoqAlhyC z-c;lcatZ;&cEFb7!JG|U;-tTOKh?GnBo?)L2yx}FUXp~vj=%R)#pU16;<_T!Lh9&vZ5F>&RI(FvUL8^0MLWdVk$cA^n84p~Zd-_8Qvh56%!BUc;!GqwD zaGr{C3m(bFQw-*{4qjvJw~+NJveMkFn@rZy0}w(;7KFhxoZj;n)w^b2HM#|Z4wQHZ zxZty=y$A=0ker0W>r!A48$cl3Epy0<(yHY}{A_CiUg4J;@XCC~q<;6GDi*YX>+PM7 z88bl~*}!*uvs;EHrwH}KxtTKhiIY_0|1b!9mDjo#KEv0@97!Rdiy7@Sx(*6f_!uHX z${RLejj4&y3HEyY#ITF)4dw?}!F{tZ{xN_s&ity_Z$x?aN>~%C;1>`nQwngHuuz}h zUp1+@W1)cuKsK|~W{TGhSc2VSKA`mn%rE#8w8y(YpMi;bU+z`pgmmn>3}xw8))5z>zA2CV1fi6DQ2*5Z2k?ZfXXol4c161@fvtCnzfisOJ8^>V2oG zf{R1;t9Qfw2nl#DLqG((1act^idjv=c5oW#Dz@>rFX!5sKpda-RVIuU0*p8iviD8R zvY{5W?q*{0SZL*N*94Iw+EoRHa3a&S8mO*BhZ_c}qF(j81F2^NZsY76?SGvq&7p1u zq+CPLnNLoI$-4Yh+?uEBzNf15GfZdTciDq;x@w|dJyo?a^D63Jzni0Gh1)!5Wo87p zaz=ceh#BFAAu~c`DJCZCGfsnmYr4MqG}R@ra-V+YG}R`Dgcto{ht2R8gL43p1~7|; z{{PjffRXHc41$ub-|u0XTQZ2*YctaS*_k&bF z3nwJ|VmO+BTqN5a>on09o}qG5>Q>2_sc$($m87`Htf!u#ic;SD(D3am&rsFqA>%hy zl=(Ov^J1B-Q5dnF@$!j{b;X&gd(DA$;^1`zO(ht^hpR;*h`$*&KaS;F5TtS?HO@^{ z+3PJslvrjwa>L<=vhjijJX9?RZ3>yFKwo>+H)2~y?PSSPdR&&GF%m39xO7 z;K$?R;XtA!Hoj*A)C7iISi%T?!2B;h z*NEKN;oKP%m-FUuRucB;MC8dWVT{i(Tm0~pF$WjG5QhLj`MleFULc zm-gntxM0A^=wN8<`0ajv`)IHlT+IIO2-=`XoU+j1m+~tDO(0tyc&_S@&F}C`4&zn9 zbAA80s`&I5^C{PZs0L>^Xfk#ip8UD{K$1Q{ZmFN)n^^y8)HgZ+lm;{5$q2DtxHKRx z){p0^s?OL$iFF?|D8AOK3-Nr($O;n9-EhQ#*u?fnoAv2KRMVDg%27ePZ*-Es5z>WZ_EHc=LD%tlcp1fS}1%Ei1C6_4jPs>#+#?i?h8}-pcx@Z^?Q&d z@)}0Pq+kwSv2*?mufcOJBcN-B;ttF_L>hDRNMo4;<`}CeMs`x!-Eh0&1#N%145A7$ z770LRK=e8BE3pcLdq{uS>(KAeJY7B`ng}}z@!f+i9;Vu#@JtQ{+{xvJMM^hiAB9hU$d+gkU_ABg^KgZHOm93-^$AYjb*FB0zIrM=4AR=8 zqV4Q@{j_E^v|VrR3!mfOV|~qW?8*Zr4-WSIYpH*Gk~GP0Ble)RCK=*+z|&`h)d3sx zuomQ$Lli)jvK$!nkn0am_Tyg`U1B(Y{Iq6O36lqq`T&4S7LoJfKS-0^hQkfiAul@z znE)=hu>D=axn`^xtvVl+52z}JV*f;%a5SFnHk1a`sP3Cxi8?ZfV;2R_XyhvEGQ$uOU4&4g`yk}tJe z^ren!9-5V25!AIEkIALdSsoiF+l&47lklOr#r3O>Y#<^KAc*rCsEhY+yf=sJj~>q! z%MIj`kd}eE(k0v9!?I#c94%xnU5V{h=PWNeq_ssx#mMx?AMON zRc?tyG=_SNhdLRYd#6ayW&A|wmJ5cfc3t5eLEOb?rs3 zg^dBs_fO_n^Ggj2A~qxCK|n{sRwUcM+?f{%SyS;Qh8nE7d-CkP4;RMLZ|zB9xVEXf z|AngT95jN%k$$oytfimfMR-~!HcFu%ZUZ5E{>zQ6Ys>KhS|*ufANn<5hKczyA?J{_ zua#bLp=x>Di_{CEA&iU<4_v4+k3Yd4$rg6AT^EPRB;L>>BwJ7F$VDo*g5WbT1Ed{% z3faJ*CcHS`Qn?*wm46l3!%1>wc$t?f#zbhZ|%3CNui{+=XeC`Y*0RnH&X-3F z$P2-7%q7rcOw~1)sEbceSWcc$AUpqNNdsnqNi*e%9N)X)O$3k%)^xVmgrs75J6)=( zhH-guDFBB-miw03|CYym9zc;ZY32?fJ^nsQ~5X4Oh-kEmDSv!}e3W_AnGpi|IGV;k<(3olm{1+x9?<%cR#%aiot%T=B}e7VX^S~3P( zU+0Zf&H4k^v9m#Mh=f)6Eh;g4`eEz_q`+ta^(b0Mt;n!vvmQ4cxN|aJtd?P~9G8XG zYDcOYQaNw%b}-5qsfudcxbQGWCEx@0s{}OT!Urgp-7Ut)?6o`vmoun&>2DqsPk;+R zW03{SwJ>f-rPpvQs!$W|1{?_Rt^hCCBp_Z5n5uH+fp9QT*-#CcBE3tRX3!vL^bJxK zpY7={Z-W@u&b5CJTa)#wQL3=R2Or_BgeCn+scs z1_Dq!fyoJmYjyc*RTdLVr?_HiJ>)V~Qk@_#@?n(oN?1`iuCYOX8o+}igxHT$HUa9`#e^%#QrLH@k#XoVQ)B;t|1@<+r1{HkC z+tUY5*}4OIbnG2+4@tzCOnadpt`lumZ3)P%y-J;tdAXN`{o)mg2=V%IBx{C{4nxb)w6W|Q6qrP%7%K* z9mDEt)n6}^F|2oc3id!xtGq-9B$jyzTqEp7ULu0T952CfPxlfW_hc`@agX1sCts)f z=(9(w8!&jRD%Q2{C=k<~dfRAK3Ku#DN5dj&r;c8)E;u#e$uy3P@IMlLj%4E^9_UL* zS``9N#B}b`$WLzgwjG)9=5UoEuYP;&*et~Dxk~4bR_&~@u)HG=W*?Z>2=ryRe)D?O z44y{5yIyt3T>$yIKio)~!$VR$i-0SV&VNMX|rnM+zbd{QoKa`7NrW{_L-6Y_9lY;)#l4IIm&6hkh3P9X4S1 z>Fs}4WqRWcDvX(ApK_o^5F*p-sSOjN+{$U4NJ zPCI_|4A{b32BGHmK{-8vC{JEd_)9R0?llu>KS&OAGQP>cmYz`Nv;UH`TSTdz8 zcpb)%Z}WCP;~%PjGo~O_fP+FH@o*ec$)?}}Q;?DcopGz02=sg6R-n!hz5Q18d)5OS z4;1Ivk$(7(__9W|LlD1$TGhTB=PLHP+3D+&C@RcyoRfszJPgxj@JM0jdcpfsHQE( z=Hqe$m9EHPc`2kl4-+ExM5CgE{>K>gj|^{KI2dGBmAdV1I90Sh`8L%fyy$(n?6D$A zqhPW4z-_8u^}-T(ekB|*P&f+{AO9vzdA`oT`eH}p=R$qxHg)RBZUX@{07D6^Xg9pt z#1C<6pN-9nsY!kN=#qprF?2F$IepSSc)RM4V~O-B6?lqWQMc!Ib-thH(usGf{>?uS zQzO_~jsgHvK)OU!4ct!0eGMJL*yRJg=uR~zFr-*NeV6J`chOzyBtKru_I=MOLaYtz z!B%0t`d(G2AGlXl>1ppdsY%Fvs1-AF^{V%r!6Bq~>*CE$7xU|-d(?#pZyC8)of+6t z606)9tn;dS)pNPq~SAVT;K2}vWr2jj|s&)|^rc2PUggjhEzLqZsOetzwV0tmpLTN7Vj!KeTx; z3l-}J8f}NynYPM@%l^kkB=rI+W%gE&||87eEh*! z|FQ80|2Y0&!uXdzMnv`C{J+<4JVli^Wd2u8QOz4t|BR`sTz@k~Sq+&)_s1Isga;pQ z7!baGT(xc>5IQzs{&g=-g$}Id|BeOTp#UBQT=D1%m<-h4GhitHurcC@X*NcdZ#0T| zN61or`3%)G4wV0*furibGDEd#08n(*6RNZ!^=qEs5#&(@#K%7R2nfV>W{fff66U}4 ziA1FO-|KgpnRtZ8>&GZVy#E+wi}$})KRPpU{{MUZ{WBXj|C47mZ2q%mCC)#NKe748 z5imCYIR34z%XkuI4?5#1H7D!iY%09iWOz}apZ9zBrqzQSlI;Tzr;AvM)4nJlSEZpuHJ|Ep-^qALQ~ zEOI}Mjx=&Ne+B#lnc8PzXEt*2AFuGd{zfy`9Ih3au`yL-jjm|yHIeK!;j2iBH1>M4 z(1fmCsB){liQvkV6e+GZ#1xb_TdpFE(dm^7VP)q{XLJNZ@{b0a?-43@_!YUMMZ*K# zhBwTLWE69U3ALdMkP3eU^Yh@5>J1H7GcOOlx?m=(D6NDvHw%7nyoPa&$&D1%gEFdn zi;)jWYGMPUD^iXgEM(IjQE^8FkfwM;fsn~5NBY6p{7n{du zWP2+%RZm-_@?uL`Z;`wKCoHfxom8*ggn0oPKtONQ34n=X0U+BL7@y{0riZYl0bo*^ z*CtTH8!I+4uyoL3Rd}%n8emeIH&x=WyO|OY1!#%2Dg=bFB;JU#;ziNE2j+wUqphiW z!(vF-V_yMXuR4J0fnzk9b@xO9b|BM5Zxr>`OCwm zCNGF$aT*Z}&MSc-dvk{U9}&YsoP1R37tBP93>UlT`dpK``#B+BhjnIt#?pakZ z#2b8tHM%0(n^VGSW_!379|#5tl4wv0!cVUS4VncMyq4hVD_$!`Z>fZdffhY@ zD3d^(Fm!LF34+wo6@{^l<@FdTbb%m^olZ%@Xyh4;z}XdVfu?2f$eoB7g)aQ#1Hn3Z zh`?#-)k{=iWo(!L5a;3zH35GCm)Vn^SH+!T)!{Sw1`Z9oF>rnSm?24*Y^X)A#~A{& z82G#@Y~nRqkvX~|UkYTgKnhp3=6O|69Ggfa-?mK4cpb~5P%nC33D}1(V6DpEP*nPPrc(V`*b>er(`uMDl-^{Osw<@l~XzXeD zE@%4@ACl>#+0# zm|a@K38i2h3Sb)HLFBts2zkYXps)SaCVC%R?ANvL3@+9SUsX@1Zus$G2x_f|^#yBG z_x99eK%|YDuuX*_6?AowXMY0~#24^e1jQvBkV4oB8+KH)Zqe)3;O+L~`1S+Ux&^Pn z%<*a6`!!Ws{v%?}4210jM zCs|7gbpF|}R!s`*d{1AzPF=vi>(;5R{Ci}b8lX3?SN%$s)2{>NoB;PSJaK_2hxUo7 zr^3EQ_gk-8<~{X0Obx8dB=|<4uV}ffM|7iOoW`XIaD&>p3!eB*HE(DLM7?M|tmt3R z=e?kM!yQ?+H8nrRdS^l2`pN6+8u;WN^ah?i)g@p_oesRIX7=2Xe4mzi0!bKn>`BLj&t~eG7N(2K4_}1MB6c5=y9I{mF&kChDW5&}?TaZ;s(LK-|Gj0sVN1gx)Ajv^)t}nH z`YBsg+lHJBS2eKymaP!2Hvs-Uw1X06drZF*KiOmY9h~gbwy8PEkHD-jlB9Rd zQ`M7}tL}Q?2daPIg?hX*QZcz+;E_be)Fk%8^M&>w>y!p3gCSfz%qh`Nf2gukHXk9c zvqi7|P(>2C8<_TYfxps3?&ipc>KOmuwf%{cr>DOGR(C}L53@p#+o6uPUKHjE`gQs@ z3tKPN?cAZJiUPcLr@AllQzk95_-tTO3gff-tc4lHWXI^Wn#NewyHwWl8n+-^-eI4&#t#@KcMlGsJqWnpf9_VrR%5qcT&jiuUeD;Rj%e&e@|TEiCn#AQY)Ie(M<{fK!cN7V44dJe)-%l#&)t6G_{MstQ~=bg8=m7-{k_VkJDti z*hU@uL4=5jWdM2Y_Y*VdSmMcl=EY0YS`lB3{n+;jS(tzK%BewSC=z7=n}{Pye@@d<|gx577- zEgyGf>auUune89OgYy4{a7_DF^-70qh19~D9oFM_Lr$^eJ2kR+Is&30pc&)v$w^={ z<3l(m2ThLm+2(m5wx_?f4e*NuuY><9h@TJw zMPIjHRaWhUQGF!T1Qb8jGTzIG57rzJ`DD0%LvTpHdcP`emtYVlctgjcC{LGp2A}xX zeg)5!1XI$!hsEqHUHQFgR$v0O_yWWX8d1?FAxCk+_c$@<>BqiT|3pBQ)<1~Tm;pbi z%TMQ|`!HS^d*DBoz~MN_f^Y)}fy@c1iDr7}oz+&u&r!Gnm~Kx_m5fe!P!Rl4Rn~lf zpc6YOav|kOL^C{U#yeMHn0cqz1xEG!KPv#VrUFd1X@^H+Fa#}mB=?vLv9W7#=uZv_!(Krb_X;OH5HI6eRZ#dA!C zyG}6SyaN#S4AJursMAx~&JhZe{0CL#>GNkyz?!21W`g%!c%Y5L%h>QPEpZ8|+tkkz z+%xEAN+eFy!`W=AkRe&BZ#<}u>Buf_!!yr-K*y|byj6Gv1$~%qK zI-3>!xAS9}uHJ%Sn)m~rtv&zZXvLVGRY5;N7YJXM*ogacNEC=tm6Nm^MIgsMG3n+9%tcv+z zmww}Cb&emx#a~n*>WkyO0B8&;t?Wq94tlzOv4n3cpOaWJc|E!1fs9)47n3}iw zRb5EK$nn3b(OAmRA+->Ho;#$v9>220eXNO*$qvayYgi_9{}P_x$#{=&FfZVRoF9h> zd(6eRusHy%mAd+{DjV@43ZI0@F<7RBMhQprwv%mOG|)SsejgSvuS5SEP$8({^$EYJUV7zk zYIMOoc;t8C21KUKI1zDy?tese1iks&5%}qyt7jikZ)C551ppkg`0cG^Jzvl@zpGY* z|FsdO#N1ZM=kIr7ZqahX;Z1&jum-PG_@PW9-o>{B3~!;Dr7ujxVakngUtpuKBx6$^ z`CWAm{9ZD#vs3P0F!3Cx#kv2fBOL7m@gOv@C-VeG04zQE*%M3^@Q{Z+nZcr`iSIh4 zYU#!d4^t;r3(dmFrsD-NR?{E?-ZQxgSlX`j+hhIq#CP#nNS;v3>P}`jfH4uYOxNhb zM)~bKpUA=6qJe&=uttayj=g~WHhTjn4&U*x$2X->Z5Isulk zK_26GMnJ>-(wDn+_V8t?Y#meLcGAWNg3?8ja6o!^z!}|adyZkeE&H|DOm@NSP;gz2 z(5LjlfK!&rDek2`VoA`c!+V9zL1!4kT(u85*UGnN@Q_x|2|3qD3Jwg0>PV7PY~P4w zk114$b|pLyJi`)Wu@C?erj)F$CqZ!Vq`bJc^t<#T%a6qVC+U~4n_0@ zcNa(WH7QR2z~OBDLW@NhPt6$mwlvqb#G@+I>v!J!nVR|}r@L@{_*^~uX{&=M{g zV>ELaHVd6UKh+tM@+xR}D}Z1{s#Dc*LaCgh^43e}Qn^p~UKpHDC_Nc7wCoT4Jbc** zUv}x-H0Q*;#_~4IvX9`=4&I2qZd$xD&FOz03qC5&3P??@C-KzT+qEc+Kx?Ff!h2w? zQt95(_MuZ=OBvpSk0F@`rt?7f3A5(TA&q`mTj@@@#SZRH=s?@)PVR+2WsB*%bOGuT zl&h)F`jS5R!d(r`1^p4y5107qoNOvS%cNy?9~;uc=68^334iP-QHaRLw%}Uo(w+9u zi+qvpv;s0W3OgsHu`tLNxV>oD>6pSKOHK?s%`RRthK~r@qy3}L4sdhFwv!N+@kbR9 zcEjCovGZ&dx3x#arJY3nTbE=wiyN;-xA(+0AOq8->KPeuZ+9@m>6Xf`lZf+OGM$!^ zdWxwFGo4PL&=WJAj-^i{q;D|^tX!zm?LCYHV>7n|B|pn_Dw22p429V1I-KQ{6!ABf z79Nrje2q&7T_czn1jX%}1e?pei7sJ?+Nhu66`LdEbK}NN*ilRw6xY7yi5&-ErU`vNAN1qA2Hl0TpW`tsY4e_bFYgdPJ|^c9VqqKn?yo19p$ zK9-=?ef8UwE7;Lkbnv50m$b8Mxp%omgs#`!o8vV0r`BS)hzB-8&uZ*+LjdmWjh*Vi zG$V+!Ac&(%S*R~bv4+c|*2S*3BXiT_mWA|(dlgi7*Rf7pos{b|lXelnV5shp>-6xy zt1r)WF3Ws3A5Uu8LnB7TWA|8>AgC-8$ttgB!(&r$lql#7oXc z@|=Ew-S6q0dCpn5PIt+7IwP9NW%}_w~^n49S|!y^1w_(Mx0?u~8EG z^CG83;U?&!;o8pdj${-7;ZO~@r;1|dY$%X#EOy#v{(Ru!B=L8^TY+9&>~!%j(|d}Y ziWC=eI=hKeU5<||1_HZ2R>4#SjjSjFScf%nT9wXzBgfvvur}oZ+t?|9f-!R|GWGN( z4h3G%H*q3=c{#13F$r7<^g4heu?7x8edUe0P4L{7_t*y+gkJtMGJkT-pFH!Yn16JW z5~phhO3HI)$vMBoDbC!8Ctp|#c&%z;?bElHIM;X3$vgw$(%p3{F27-!=!+Ctj|g&D zk$kwMibRlA4)m!kb(%Mx&okFfhP_TFSjaJ4;#{ptozpVe93q3;K@c;omzO$a8O(x{ z20C#&pg${h&ZuI$$&nn``(z@p6n|&pzhI>F3Tq!;`X$3cEEk`)>+{Q;qRVbW%-T>S z4>3M>Lg>X`d2nE{9SIun>sx z06Qm604~!pfsf0a-gs2jq^WaU^H^0H_W2^&5qP1HmT~NWbAk~pCUa|3Cm+TO6Pr5C z;kxF9rcV20skdE!*VL&%Q#ldm#O{bKkp_4Af|m%p3!Vq^h%Cyb1B^S7hAHqHo}S^G zWwILK+BP=gwCy066T()Jb5?L>Gm^jt)K9f0Lx_^f@JfxX{h>%1K)yHPG!4(eUZ)*J zItXxXxpVc<*}-xVzFFuBB3$9(@GB`|+;H%9DuP;rtivY-AAm7J22c*=a*e-f)I*rQ zOuRM~VkF_Bz<12nAC)^@@nATo!s%P%M$rJHgI_89C&Yh(43lA=?Sj&CWVla&q@v&Pv^KXdDzK6z$oiAMls+w4gtmdCc=itm0(xvcPpH{HY6o$h3|kH zduu*Lrp#I|{KqeT9w|K}r!%;UoMz5A$fjpBbJ__F+9iy~wq{P-6jox9jOI=>cDt)* zLsOPu3j%g_vv~p;v(?s{nmaW~<0(_o4=(E0SYO`4DXW=>X75EzS?p*`1drOM#(d8N z>>Y~=&1nTTR!&Cynu?Jvf}PS<1{!-=P)S7cV4-%5tZ#@i!te#|TK z&K<6_F~sY(zO$v%+xoGZS6ucI1hV{4tv9uF`qbPWfWni4a|#VJfH`4|!fU416Pd>E zVj+6dd)#jmq%RSqyij8*Kc~cRVqW!$f4s^iR$q(ioxJ+B$@aaZcD%_+efKi=`#!)U z(@*@vr2uwP59rmEPSbW6cfgF>j72smHV^7@H8{$HJ{jfX=tgH%Ik)@Q>4&Nu2y<|_ zyjJB@G~+>nt1$IoxDs3N3yz9#`-Qrk-u*o4(_7)-XA0pHhw84aoIaA8$vQ2YJ}?6eqE8y6lDoOQZgwbNFb+Q6nRs&@JmvC4<6 z0*^Z=)m%pLG5qT47pk3JQutpie5BebmDFLTnzeRL3eOHnVR*Q?U;ni=*oW8kyR97s zF=&T2PJX@5XS8uT`rpvEw{f;Nd%Y?w@v1?6W?^KYkAT2LKY_r(NNm|LZJpNj8mMdQ z3@eWDGH#$5A5aTejT@nE-OlOJ{44m|SuH}&a(=>LeQP;9&LQ53h2V48EGdxG-rWwj zYnB9|7^)YvbDB$PBU2x=1K{~>GgG1VPE`-4AjHN6UD`x%`gD?2#V5tiY7P=*gIqm{3Be@(J?&e7L)a89`V zLom=durhEa1+0+_`Dr?V%RV-67!82GA?Eq`Ry!pu*)X3&2xCgJGvM(7EH0VASduyN9W9%W#4(17zq3j zEv~|6hew?vP{0O&v&OFxP`knajVlBREe!7@w*?_4J}X1qEUQh~%6Qq-NHQ-kcvg)k zG?W&{I-?pnnKvfAq?1#X%04=glic0O=~puw8VL51%!_x(#;6gmj`(yJuQ-g54%P&i z5W#)WkDI-@*d#!~UjeEWA-GNw$H&qJhQ~JUJE{%tD5_-9UM??LPn7C8ot+7(hu0fq z(I<9sT6TPcPH~EP*r(Ewo-hOeKBMb-&^jQ{Vm0x7^H>+>*fgg0QLLvw>Ed*$w+qU; zIvsG~JH4yZtBN=4A1OJ>kUmWjYu#+&{oI8Fc331fcVa z-JDYjJ``3U4Qm(#?~w(p&T3*|f0TB29?Tbo3p+eO^rf;~hQ6k|b6xMx;igP(PTXc> z7a$I(4Ivg7ITvdaTw!`2JO;m1#3tA^zh&yGVy9eB=;2tGyjhiSH^rt9*20x76G>Sd zbTb$}7Mq6rkSp;J)&?07K?NwRz@vGD@(W4H2WVFy_jp@p_i_r_#KNM0%457n+?HHV z+=hLRW+-r@xoJ#vd_^y(sD~S+f}?^dwJ093buZ@p?SMUHEXl=%{L1b3P&N2eH085i z(SJY2DbL<6yiXe$RR=IOUmoKOL6|GMr*mu>u^B>_5f~OH!GEfxAcV(|#5~&5X_mq= zthc78GpzpAm2owAb&Wadr7g*j1n!9USBwNk;USJ%7RFAP4Ng;;4NjUrnGJUpW&=*n z%w|A;r<=~|cLHNgBv=jw^LEc#5Pa(3un`XhSpp5 zSO@}e*yHm@_*{2#Z|BCO(kC!}qBm@sD?k%yRN}KXV{NcVoAt-XJNNjX(3hOxoZ#PF zH}3@JIlq6iR{e07LQx3q=!GSOU^vVBIWKqJT!jq8EvfKJD=0yml=qnHvm=SRLVMM+ z4}8F}2yW;L{^B%)B;eh@I6b2r9J~^8$Jotfs6AuKCdS#^!`^ zj>oEVAqr(5V1($FYc8L9fl#HOHKJjFyqSG!{noR!9E0>FMA3wwv;h&8CGCV6K>=7*fExr%84Hb+S{LaE4+@aqot-`2N_UF!~LMx^Vgaa^Mjb2fnhvykn`sGh=e^1Zr-Ky(?m7cpZ4Yo7pDnqB(kn428Q$Io!mw1z14sW3|-_%%ofDh!`FqG+=02V!9JG~71iFZE#N$M$$X#~l4;--7=d0cgeR z$_oaFi^frM9oL}fTL(H#8}DQE7`_u=EDxZat0!rm_CCEKVKp56@jz_s#c)#Z6chq* zxT0V+j1M-Wwk$-P=Rv1JjC?m{^d6b!TTgXL8V?a^yO3isF@lYnUiiT9!fsSnQq~XI z+a?pX8L)&fAFFOHz+noeN@fX_An(?^#s{%hhfa0+RVP?DU|U)Tal=Z2b1YvtTZRu) z9SRy>$p|mf-{SI?rBcXV@((i+WWkoAMOMmAcA|S zHL28FkR5*VU(aEhD{)ycSA423{E)p3KHZt%2ZuWdq+>rk2x5<*Y5r5PmkIh~W&PntmWfpeBqnKH-Ec7E4m&vKe)F$f^Afr}ZkYW2%!IZX;;UE z;os%wI2}$g07->TjW7ri8^t=roFZ{$uVg|>z;(i`Fhil3Tyrz9$8_hxPD_Z)hYfbh z`z_Ca#0{$gU84cn zJAb(>7lJ>+umk^CucTE}%OVIKWq^$o6xc=22qHzGO0{*+Z5nv++7+M_9d5KZEBS-H&lDc8@ek=a{-gx@@`uhI z>I^F1192m;UxW&9=L*?zJPj1H_UPK7PAUBNO&#h~bePQM7X~m$sQ|%X26z&zdPccF z0!X5|S#pdNaM+{w4R!M2*^9Mw#xSR_bgD}+!J-LeA-Bcj1Q-U-v^I)lk#G?Xl+#&H z=}U(>Ejm3|9d6Gy1J-zBF@Y_)8E)_daGv^DmL7FP=&HvJb0Q+!ggJQk6qm^B?_e8V zp1^*gNsK^fJtlzBK=b`orhf3-ex>^5t^JbpY3Dh|mTpKRaZQyWbJ+IJCLS7OB0sK% zdw1uwa!4!8>SkbjGm-@Y4AtHzQN2*=@V)c&Q|CFSrl1&5I;2-slosgP^Kmqu$1rXT ztGMudryPM1Dd@A#rTh>RhTMf42IIf53Hw5UGLBCmzxZcK@i7hZq(_Kx9?th znZrifNT=@zOT)8RKNy81e}|qEbmh`o5lT9-_)u1N{AQwhd@YJpM6mc_!t+bTj)PTlr2oMQ6NDx{1Ba+(Y1;v5e@< zGNqFV93YQsle)kJ`nAjTnEmG$>hT9oPSVzn!KwPA;SM7aT>aeX1(Pm-KIIDC z>;k7l@i19xIwXWl+y+g-QGxL>a^95}IE78u7_BPqC$RcTvd6ExBPnc6t>)lD*0w4= z>jJ0CAa4b?c|e82*<-CS?;y6Cd#Hr^@#%2*5bnnDfD+iu zvR;R%o~@m1XwyF&eOq8fIQudi=5gv9y`RN2=%c`eO8RY6Z7DV_@R92#g6*l zYHYpO=^cUjz*~N>#d3qG@HZDwbN~442ey}4zv(U`oQP*`F>Hj><1fgD|JOG_J7{eI zGxcAZkVL0q$?k!eiCMc%7FY3}5KVtTZ9-OEwEzmsA4D+7Z6jd1vAQID3OeW1Amjl1 zWd4G(fA?3Xuneb#h!)Lf%l&NO7zp;JIEQZyYa75ezgphsPyFTKp^Y;E>L$+rJ`Jd}A=&%4ZN5(21a=*S8Ei}a^R zo=CJKUEx89Wg%lCQ%$FJ5J)P&e;EJHJu9;Y4{Up5*Y@R3ekx1uL`m&j?&Mv%BF)2Y zwDXN=hx!LDJP^Z9V4eKYg3~QS!U4XyuJ<{o3fQxBzRL56lpRgV@CU#U@%X$~gnk zOMf5bl%&QMt=Sb$s~RkmEcafs`~>>ZOG8kTHKicuds7U!fi;4z0SAcOlwI?1cfsDz z!3Q&Xqldugv0_6L77@1QBQSXXLA~J$EZ}18zY^So)`eF(C&g9@ipvP2=A~_9hkb<^YG*o}(2Jf**69qkCWFOvm+l$5l>s zBaKH691`RWfNUvf1TiyMZ7K~^k@cnY9Q<+g)Plud|o z5|fj$QWt6*Bui23K^EOZB`+*@zD=sYeJGul3fNc_eF#Gvp+ptebQ&>ZHc7ZWptVh4 z(QTj3y2dH!CAW1MtGTH|uRuLx66pohQ|x0bZWu!1VVppl-n$|;$Ap{V1=m0xPdzOY zw_M|N&N4S}&WSPr?F@DbEgl}&zLW#RuH=RK@HI|GD|0UwZW{M;6PXh*H~ru$2HYQF zy6SkXlb5=j2P6AB?OLb0l4E;5iQ=tbCLdC9QM`+~ZHB%Yw{$)2TIZ~u-mM#FHUKM^ zrT=vAb~hXPUZLAu=M-hfsT%}P5FVX<9ZY(+>Azm*v@8XEgIv(s5~AOaIFN2NBVTr% z(}LINPp)&ic6Bet7yu|0FeFtpeAtgh+f7M>nf%=mOu+-~$)llfd`yoT?X<004qF)m z1+#~J<*_MY(1-%*-lO%Z(N2C-b8`;HZq7K~z_(Isgf+p<`M_wWQ?j`^>$cZB#T@9# z*E_A#2;A3_DZu{6^}tn*dmt~1pd7pngPkT};c{b^ybzoDkW1s07%CQ?7)bn^8!`1) zaxUOL9Kz<}{*J3?gTh+yh~PMOCD$ZghpAt4p>#h`1RE7b37C$1UFPOS0pGw1e-o)r zB(O0;5tD?0+TZ)^{RTg_1GRw=KF}WG1vjT0MC-V-X%#1hzw@O@Lt7}rSpW{E8lMs` z)|hQc_`-kB@#M(;ST3(5;~Dm{b-K^rKq2?&4mUu{xNP0Tq`z3(tMup_oSrq3BE7&E zUM-;-4_L8#4QvYuX@vM<1QXK=s-YnEkM(dqwkRe}ew1ZFSnwc;z`-I3atPG``e8!G{)6aL4GP?=&%Vj&7C4ZtAH2oMs{k{C83(W` zxH#Arcw_)uu7KX5qhGzrX&#$&fRavl1ag%AL@6}WAwFs+t z{r`@uJ@y0$E3+60+(@9G?3-|3!6^xw4n5k7=EfQ7iH2&T6-Hp@A#Wje34)Vs2Zi8 z^>|U-MtSlDMQ&`50ZU9^0Wg0+3JC0o6y6P$30W1GG|*1upg!-G7;Dqapo51Dvdh3d zfH&bfl7T?5qStSNaa(Ng{||gHI~8rXJOJMG$w0Y5{*<{%vg3vEs+DBS7^&4`ZjN{N zC(61U!zMNiN@v)cqv?Rh<8W6HZonKp=kLyO{!RMJzdJqLa{$k*L6ZoeWNd_D>;#|n z38L!B^5Lxowu#TeODtL+@w61a2UcGxX8R?{QHfeKu*8`O{jK{&4pAFn6`@Zsa;W5R z4<9!uxd(fE-xOm61b{lmfuE)qRXU{@HMg1(Tu1ktO?sbBAu=EZ`5lqfbF^ah17Y_Y9iB+ILuFh_*nn)UH=uz3j&J>!~3GpdJz zD!ke3lP_YPD|AV3Ct4{298~P!@*D}46uBb+RqL~C0tlgZoP)Iu9y_3~WInFEA)ml5 z2W7gk!|^YCiRzR-VTW^Z0ewPR1NH>%sj}=aL&s#NlTi!>lgQ~|y(QXpd~Mm<#ST2= zKzsgWZ>I~v(xMN-38v{w`#9n2xGW!#nOB0D2hEh&HL~Fatmkkxmh-^~I zc48tgVvI$|57=W6P;L+xQN!Kzl}|d23W3;DUA!LWwQ>-d|LRV z(}`>9?duftw^m=LHh(Yf>lEB10-9us^P2U1ESwS(h#(z7KWv=e;%^0*?#>i&aCz)x z?obzfK_&H^zdN~2;qCKH0JdJkitsO$Dx9+H$rOkn_IR!vp##Vr#JDOkDZ=h`eXm`NHO~g!C-C{F=0R-khQGLgoz|E6D zGrwKswKjpE;KAN@$X^T{*RXz0VdcKWZ+49;MAMKssCBO%#aWtIdk8H^O`q^z&Mlfm z7>NtE#b#-Z^VmbajMW6@f}o)Wri+{6q~l6CY%AcxSSpd00*A}kyyyv zAWo@O#s%d1n&d0cwb9|uuCx}F;>tyC61OOkGPiUo^N`ahbId*9)wELtQ(V?nrk6bB zggaob5J*ttQ3{AteHcL?WLDZ=K>6*BV1?p%P7dz+h#w}S6y;Pe&(s{Qrk~EEpxukf>8nZh)>Msg$srr_v!h0dhF9q zxa~{tW!tsIJ_!^MgD~&|S|G#G=ODzF0=|c???fCH2dooi`smZn1zm6mL%Wte;u#!g z9uqKHqu{!VnkWYWcY&K@&p|d!+#lc1_eU>3k-*f-K~BAt!P^-|`huQ5$Z3)~3PgwO z>}S1mkdyDww(1Qv0b1IA*ZK~!4u?kQP1t8i!dU9UbC|Wu1&KX&Uu034oB~miW0R*T z@+5zP(RB}vrDnVSzks(J{N}>@*3&nE&uFzT5!u}Zy0kv#ly1kmPhfhe(yMcu!AyZizm0(t6D)XlV9spA z;4@sn-HjFY6l1N+CONhJw?M7^)lg?W(>)AxUPeaLKMi+wdiyMB`<(Nz7cS@1M>w6m zKj@!EAhNKJt~b)T99921(z&E$!SX_x`XHo(O`Q5uOb@$uq|+^MvSH{3u6WHd3SBF4 zg)0sW-HG`*^7J8}i01M{r&oQ~C?{OWng}%Zy3!M8U{{5CXy>m~Zb=^$v6;9?!Eai- zIALmIi^Xc6>(-9tH;4`Ae2zxiyC4Cbv|l@;fgWSD^8kL*M?1Bf2u6u+Ros$s-zoZg zk#U4Zo&&O(8NNgVZ`aXK(sk93j&__ND=uVg;f~QxNozhWF`tPS3BRMqni<71d>pdF zJeM!`NEc61T5JBiQ!lU$t`K_eP^XT5{CVfnz#8xqojJy-ulGOiT-!j#=ZAt@WB}mK z_BX@mTL7u)!1RjC})2 zBjklViIh0UK8%%v6a$2%CK9wB-em5CkH=x} z9?&V{otuKOmUQ>=h|zIt!4xt`FBp#)`~!OLc&BscZQw1~N<>ipi3oVNYZ5#331SC% zITX5^Vf@P=d!mw|m4^K0NXcO~``F8fFW`HUT)p^ZXCrCg1m|Ag_htIT1gAD0izYf3 zUOYBMWFrs^uXT&{Ls{tmDTV6zAFPhciiAR)b#?SFJ8Fene3JCv3=L%O6vV0e93rx% zfH-{fpAyf+q3L#$ox-c9%|T8pE`R7U@J4&bY;%V+jyh|eWV|G3IsmyH>Un!t{N1tB z-wB7Xe$x{sJFQaPde$nveX^5R8GpCGod82-xp6Y4~GE*j(I+ND?ny@aS5>i)?S@q|MpvowIfMX1UTX9spsk$NW7Xg)5!$)sx=cCI=bpBW;%_710jP#a37@q zITPluu6o=|r>rImUkgCg2ZHcEWM)wKe5SLY1VLu0j2r{LFlCRd7J}DkPVcH`&O!?t z^}1P3S^kC+95)c=h8ozbfiP`umbG4I&PGJ$Mt%Qmr#zQ+h*VJUz-Yl>x)juyJ{!Up za_!A_I@gdI5I(WmSfv2oo-+rmWuv}#j`JBj@;l6RW}xoDxrmcow>;Y(ngao%c%IYp zvf&{&TS!;i{|J=b#}JF>wcf}sGPs`t+()4wsbXb<)@|V7*arpJ2kSjH=RcJ|d2SxG zvbz_2JkP1}Ln6F!zH@$^KIJA?Dz0gTa*pgC-l4pW02{cC?@&~=_O$Zyib&I#0 zmH9u2bEvO9259lrl!E^P);Jwnz$eT5&hT2PHEvL5C9Cq)6-;yMN}e1X~~(f*lAeYmq!FFABix9rzgvi|BzbX z;*g#@A3nzS>LzQQ3$P3CUF%#b+i&h#p#B)WZLJfLXYYpy*KltXt3K`8A3C}DF*F5s zP`>3@<@()k7dve-v4#dfG|9Z7n=HWrrt5;6mH?Po^gV9_PsZrnrOtlu$J)EhDL^ui zqGe9Ay#D2wIIt=}3p5;SF>?4)X=fRnWyk1$E_3Ri(~ni?&KZ0CRCxv<#cZBPK9kkmw8E*&-^W(~A&2Y5E1bsxi}O}GcLr(z zPWH|W11jtzfNI8j2)r7u*T3f+$m714oCZ;whBTW`Q__IhpRC5Bb=5WAciLiCGn^8- zeIgdb;$vix_&v#8eb@VtfxGHq??ZB$sOP?q&&KNS--kxMtFF7o>756f5U{I!qO-=A z=DV?a(Hdu6U3T|uNDdBd*sM_pyM4rZnDv3vjC1?)1E(a!FMdts$-t}c{}A{;L~s8P zHj%-nu2{f&)?G2sg&x+XlCU3+-l8TBViINvKz6J_@|~=$p&`$>kSCatNc31mZU9!$8$}{~z5sVBf@psSY ztJXQ^w0Ig_qfM~8lV}|$5(77mgyV4E;1?FzDxSIjZ+4i=3vlNBmpg3UI;TN4sU%dF zi0jJ)89e3#>Dj*yp(nc+q^)^U9ZUNv)kauB&;S=PwrzCoG#5md_|Lc< zI^;{Z8oC>^HJ8Bw#(%cc5Jm28QdZ%}!m5=(9ga%Mqw?C^SXCz8Sf(?$vwoQ`z4u8fjpRY`+8uZ=$(FG2GHX0IhP`iy`y4jUn_mjp z5Xh-mllM#E^N0-wNyZwlGq*T}^^OFmnpb_k2-;9{LWDNYn~pOU0?!^)y$V$;M_6vv zRcHmhmir+amis~WF?H(*^x>CyZUBXP=A$6Qsj0kUX<6_7NxWGrWNqc}K79jbcIksJ zw;t>#FU>p54LrwMjpnQs1i6Gzgw`f`lTB!w-nB(IN$4}@Prm+MUGW(_+NOvpTvB+_ zr@^cia={Q4|9>u%yGr4IyG##Vaapdu?QW&p9j3gTr}{4boRdd442N2dDei$B$^Rb5`2SV5eLwcincL46lnU48Hi zr=a+>TdTjyuwKg!UFGvudY{nO^}M-ejh+}VRuZ=WxVuen_yQ`Q(yfS2owWy?gZiMq zZgtAff%GG!2WIEz$}u@IWelgSCkTnbW9P)_bO5dm9-x;Uv?l7cTb;6o^RppwiAZB1 z>4Vh=PO_J*d27(_;X_UgO={}_o})cV2=jHVZO&hCKT`i~PSa9mF7rWGLca@2uC$njG9fb^GM!*7ToS)pW-D!?bhHQ80+>AM38`)*J z695DK3`a8b1QZt((LKgWVWVIr+(?wA}1~X(z)KZxjL_Xs($-R#64`*TfTH2 z!_SR7oObP7W9nr-1wsVsS0!}RdX8r~N%CLi?O~pH(JNU5o=8yzUeKH;a-yHM zBT!s0MP#l=+AI1bTFjJ%D*}3;1gpTJ0#gJEjUp!KI>kT76;Y@edTWF{j3obohAL37kg##f;xNP>yrFZc?8a8de~lM zdECC&sTpi3_y$J!>|UpJ^0?~P3-CJNMb!S+-#GP?ryZeZtIqn?xvkxnv0{qCCh^;g zGhm7^4!0ThI+(p-L|Bmx&lGY+IgMH0WZ}pau;r`A^we*i#_9aTAiDLn{_9bPoP`cYb=fTPsU_L1Gz3#PFO%Urc9sqhe zyOjC*B1_(sSm|Imj`S7V6W$B}U&NYYsXf*Y8T<{{&&Yf{_A{`Lz-JtSEGi;D(XPp{ zCg7;DbyMsC*+SN&TZNbps=*Ur;Re0|u0)V~#}k^UEB3=4a<8^eTv4cN-FR6JjxI~~ zJGT|enx;lPwl5UH`pBjR(ZRa5_|BwuFVi~RQ?ZD%Q7Fh7FZL^?CmqU~*K zBp-$~&5Qww0pnvJ<(8IVG_jA$7yz|V`mqDfrLjx{K6@B44e(}|^#`0f$&JQ=!wv<(mwgLU~BF zKNy^6GK2EWQe8atnRsz(Lh=>~~+oGx(~gh25=hKJ1)Z=P3v{ z$QctuT=3Wc1ObVuj_nLR@37OV+f&%KXWs$|Tkn*uak|tEm$NfO?KBYAi;h4Y@RS~V z#AzaqmhCL2%u5G>gos{X$(yE#I9Pkcxw-J*Pc<<8ypDL=YwL_P0&xt8K5z#f!DU|# z>6bgD&ykQanhAh|y`s=bc%sR~Yj9n^#eIdMfGM)~0@YbOO%MACmq)s} zGJN*0!)gI7u`%!&sx$6vs$Tw+)41lz{-nX7NlD%`aY3@Ge4~DLTGi>rJ5K3`g?{l@ zz?w*pLuRA%wYTM?75b*1oz_XcqN&ylJ>+L6-24-wAyw8$MF(7D#wlw$&c0+metRoy z=gdt`Ayr;@`*DqZlFlk~`oOzSazgljJdl@)sL zF{j@(+%@A7krNI^z}qC*uKl{FZ|Aup6A16HU`%}S;CiCB zjw9LQkjXi=-x{lbIPMg*zD3%U^jUuU;O`@nBCvM(0cU~=pl8S+e%Ww_nN40*Z7W`&>W?bh%YXJF1P zRDwf&0?h|T4oISJ{oXH5X-ce<{l7SEYVo6|Ie#2h=unbuFMUxc127Qh`HN3F9nx86 zBt!0?>(Ui-YUk-mCy_^;#RQ$+aMH=opIx4jOz%XdJxhiQ5&nUQH(URH5^3F875)X? z^aZ~{jm;-y|Ldmj_|L=M>EzXD5)D-%p(1r;CFIIh2lglQd7fJTDi5{8f)g`=0rm@Pv+WJ8BSBD};Az}l^#HDWcr;BFduQsAX{t$ZI`Yd) zn!PnB?BOyB$Pi={{urb18+7njGYUT#g^B)g+x0;9f>?sQF(MU3?a6|MY@QdWK$S+} z(^>*!AKB(geQiiJ%Hiv;jMR$d@Y-{+we+(gbx8!|&pMn$>q5lCE$^qsk7>UAkAQ}v zQ++6;Y8Os+;{v2e=7&+I_W;!{PgfV>Fm|4$8YK0?QZCWmEd?4Tf4*d?q9VwTkk!S; zfh;xl(C>5X(KwQ3Tm435s3w)YB9M3@>98j3K>9_Gn9_vGzK-uG)qq3b4vRVYXk`wL zQY5*qh%rfOz{xiX1N?Yad*`QOyc}<;!6BctU1*WCIKtG&={2nlyMW#H`g;6`pzijZ{+a!03x zLzF90!Wn?74_poc&{C$c2~#{nEhI{2A|YUad`8-ZgrX^85eTQF4rSV-S&$0@I7omz zbBx#+_R2pq(H6zW#RmvUBR=94rd3x^jzD`BI!=OydmEVm`7(@_Ugz~(Z0Qu~@^zUu zrAu!S8?xTiw`QqGheaDWQObs{EPxhX#=OGlVJEUORSTZdCbq7DC?s)vjo@A zGChfIkw0-CPY(D>$X03L9YmbA};J4idE)`4tw7bwKN z*{WgQ*}KxOWUH&{@q@1=vjp|1*oeu}8b;-|#=QOuifXF+X}B4Xqq^7OC*$0h8hWFE z?6zd^#9q_=B)rmAt}1WJib!M+*P~>Jo5^5eQqOI8KI+ke$6Bj6-@oLlPGzu2KvxU7 zo4T7gEWndY>H~2ZgFMhxZ_ZUM07%@J^=|>$I8VJ1WH*QDCiHEdYSby72{hsf<4TdB z^n@I_IH4jf5%YU^B+AQvg))H~@P)n_iQkDm;&U9zIp$mQ)n(^wSZH$13Ip~~2q5?F z`!hVg{q(ID!kJ9|4Ldq3A0~)4=c|U^Pqnu|6$Dwx*fSj|P&tuLWoOZx#zRTaiaj$m z6qT``>YEBwIByZHAqZ_iyVGHjM-v0N@`DRht9FZE<`8un2%(&Yldb9gPzZ6ZjFY0| zk8*#a&WaWd4jHGtUkX%to6%ch!%rn+t-~a!yJ1j%Guv)NZG_>e^udK77>Lqx6GTYH zErqIS?hIKH`2>i>PugN&V+&Q`JqfRX_I!1rak)*k*(2RpF%Zxf%sxu#jsq911(S{? z4j5Iin-fb&9b(PsT16@nc`MbVSJ%o6# z8CdGt4{U9rkW#vbU)!4id5<8JN9LccSxJ0!of@>PM7xiuO9$7i~ z?R)ZViTaDQG>=c;l&CiHw3$!!OI5TbYkq|%5N2yJ)Nc{dV8B!gD#C-T;Jr@-7<=&% zL507Ts^;E@^te(LX>a@_?9~TdKkQI3No3p)7;MP({sr|9<)8Mh1liBhYbnO^bf~4u z;0JJDE%2a?dU!3>)wjPye^*NtR4y%-BR6%4uAa}{v5NzVsVn#dR)8qaxYveMKrrVO zbZuG~Pvp`b^csmZ-2&^RU;Y%aARc{Z6js*fDH4u{i0?kNRmWVMHIRhZ9wu_m+|KU=9YU z$9_|*KzA9T0%;kC->V(t@^~+V% zTI-jjQ08ofW1{X_uI}jED~i0uP}1PkMG;f1gp^h6K^c~os8J9nX?G1e;@sruP#{Y*)985Z0_bFmk2?A-{c{k?v* zk!sZNKt@Dt+LX`Gc@l(o#;YQy8ha)$=No*sQvcov;GeBqG*;I~rln(8V1DWDc8oxT zq}mm0kKZn!7?T>SOEHFhjUkHk(xE2mA38` z0#7gfbyM|r=_H9mhxiYELMKuDT6E2#NphrqyP1k$8atY)dilM8a-yUGfT*&k<*Apo zTbDFf=Uy-p9_W7VsRI0#`EIkO@o<6X+xXbkeopkiQqmPBM%n}LPhSYXFX$o7)oocn z$c29(M3`|B^cg3btE*Ds%*OB(T;_3Y3v~cdA8uF*k(*YkiO19It;f^a z+N%wTE5@=(O$fB68Ea^e61&%a`h54BZIeMd|51#MMn#3+i1I#eFHpyYb9`ebg%N818HW{b3f4TVas%cHd_ zP^2$vtBU@EHV(E`wHy80u4IFk`7VdY{`u#EC9Tyx&s8>-iyM_0ndtC?zwv(=GE%HO zS2e+gI)tiOzsUyjxU_ziZhoGMmQ_K$g(V8gTnt2HLC=85|DLDHQjWsg4F`{rx9619 zuO6yIFBq(&2TlwsfDjZS`_W7Le_NOP4*z3XKKD;?rUaz|`X4UQSD&w3eftHfi1_p91*%@c+W!Hh^wJAdtsDOvAlYUuiH?aw2TQz$xi_i@ z(xRQp^+8*5c{^3w%mpBj6142>5Ht}~SVYp55$#liGQbSRBt!!kIvfnu_8>{f1kmgl zD%~7nf&RLkDo>az#!$Ui%+`{<(&R#ATicnff;HqEgE*fjE>!h|!F`4sdi3-QRdMSx zI$4Zf1=7<0C7!mxc#k=UECVNH`eA+ILKW>WC@q#&ATHR1>^bqTJ)s&Nb`ENSrTfc6 z*1Wt^N(%ml-Q`@QE;vte=wofeVf2J!A!M;KN>>T_`9<3%=0yo;0(XH1KCEB8NYyDB zP(sZBj1mAH36aNsZzGHpma-2%t-rlU)yn(;M-j+42DHigqKhFT4Ako`R=M!--+i&V zJ%G@UWQiiVJQ*OPZIt%_Na!CpA)`RB?RjG5pCCO{2RtvAK~xV)g559-%IARf-1Z%TvRlH;_77LWZvl1vPOY6yT3HyaS9H@#>Q;UJo189^0FY-xy`>~Kl z{PUqb_JE~jgQV&_XhTeq`hH07SV7jn?GD}bH67GKT#lR4QH_RqVthx{%lpHE{7Y31 zkL=AmsbbyfGIb?_VAhrEFD_Fzn$pVq{p19k>7pjZ(jo=;R0<2ExYM44<(tO08wm}a?3>|#CU+tu#HGU?CTo$!oM|2@B zsKAvJ+d8SzbNKkKnI%t|TsyA~v$7k6C~|Tv7)rinV3uxnxmusa)JUnoq1f_fUI7Km zHht98v8{<9%bL zAQ{ER1^JQT^&87+cK|_k@g5_NqZn`&Qny~)S^b$XzEaHrqV2p=bw-DcuTnQbYJKu5 zH5)&zu2z3Vl?hj?M=P%|S;FC-!es#X&RhoWA1s4iHRx4WmNT>7p2?(W?ph>;3Ox3t zZH&;j8`JZnHU2?sZ{&r>`Mp89Yc=l~4MMkpd;{gaU|YY%zjT*tRJ5*PKm}Gmm{Tbj zS-(Me1+Md{ARMHYf2|&MjcS$BD@u2%gL*waL+ZUF*QgFT#-?Ql=!7cTxd51O=WEqQ z|EldHbnPzcwo)=m3H}Fu0cEVo{yI!4B3c(wD z=q}_|Bd+?e$EdW%y%7+MR_bOqsM=8JU3-ISn7XTB8{{Hpp87sFDBK0ESKXi@ICAW{ zK^dGd_bz)+y2O*Z)Xk@F{*$`6vNQG?<{g$hD})e;!xip4 zIin=!j1r3_*2;8@cd6e^ypEM+Ari0CRV5~!xo30%cH%KP-<6MXP6la)3kc%9dQ*Y5 z^G~1$x9b`g-(0M(yGex$mtxmoeZQdedhEyqoI`Qf0XlwPKYf!LR6GEpC2XVqP(Qy3 zh5_1osV+mV{pL5T5?pzB_01{_YW~-oRRNyX-mL0GUt8_7c}5-Rqed1^Up=E-H_}7G z&I6BE);s6tftC$I5wC~FWA$wJA{1*O7(J&Br4Zl2JG^dJRqxs#52wMKPCi8k>4X?+ zAg-H=YxF{D>$ksrJIMx#VF!5Uhm7no_lrQBhHlJ$b6kdv$QNV+8r@a32p-v!jU2iV zj5l;u#kF^Q7E_728of!P(PO2ZtQ6{|>Qo-aF$aN?(97ZNFCLq3_u;Kjc3Y;)oC3yD zfcy|i@W7#_9O3v7)8)2#`Se%wDYE{WPpODXcQe1srB#WwPQ+{JncY;rj9c`HYrCm1 zhlD{Hm73Rj2iXeGR1HFRK$ROd{3%*NY(~x+YPl5mO5;?hX4VcYlzAZ!6(eeY^Pa*; zD(!FLxWM+2+Fj%XZhz6qCrp5yICL)diTGX=JRO>dhDf`+d3SDwUk?)tA@0W{-%_Px* zXp6B8)WdI67u0ffsXnu8DCeC?00u;eB;0Yf|2FK@fjW3Qj!B>EHn&6l&{f}ayQ){& zH43FF`GyNL><^fRF!g1pDqmUaY^5kqRLR<2C_z9@AW@3hJ%yGpkPAPsX!qPg0m5e< z6PLa5lYBdkP{B2DKr4OVqMIXzG+odNR0&)4RI22XviZxQP-Q&w39qDJVW0w5YL=dI zhicY%*(`~51R7dz=GlBA--bzZm3e_>U2Xn?@auI{Zti;Xh(UjwM>!fxuy&Rn^LJk~ zwAOt^RnPl>_mx(%@A2$A-U!$xL^I+|D3k*%6buIeGQZYCp?A$FZGGGWYCuUV3NppL zy%_hH;@+G0(?}%}i%yKrKD}u0Zb+oz%2TR6J(p#t6ydUw(~Dkt7vlV>wVwRcZ_~Xh zVHAf3`fOzOPbdOP#AFW1DZmsS`eCK+@c}y9l&Xe~570@gP?5}sLZNP;43eVO1>wyJ zAdGkk9s`>iUeSB<*?N|~H-Oi}p)yaHJc1AQhL6RC0RlM;gOYASiV*JuQ+a1SutJ^N zswx9$g$#QA0>F59DjJ_xd*P?t&Y}5!ZxV%|_R!T+(DKFX>GfPEFmwfG1SJOTDp4wc zk$Uc9+zrQ+V8W*&A_N8^>u)w+ds^x7$Ic7SpThK{gX?BSvSVBc!8DS8EUAycor|PFxJyg*E-nu5x6HXS>ZLd zDN8y7P2psBpfi2#pH*JcN^sgFz4f3|pnHZ?YF(odXPq@dcjQ#S>r#{XkJsJ|!AH;j zv${5F^fJ~GNGu>9GG;zNjzGZ-sQ#-kM))#OJ$DAmw+lx2Vz%$nEW1kUN zApj(qwZb+ON6{5}=v}G_yr{(Nlx#ouk!7dC4d=tVRDQ~9n`*!*d#v7nmnsb|TL!|w z$ynW0$u-}70wlnMV?IaX&;-N+R^v|U9<~<_NwI`ifIo;$6~G6(2(izI{2*IYzd-m8 z>Ml(#D6S8GvnaEk0dnkYI2Z^|My^Av-|^}$y|kGmUZESQz=#@V))uK0_p>DyYa zf4^J(J+Kw_L237zHohD2ouFwKVh%-X7fmiVXwos(E?6S|gxYeK*M@2nP{I^p&Uy+O zNQ`v=EsPwiKKK`v+)SDz=Ap^|0P}Rcd(@R#Y-b$WG3YZ*SKg!Qb!FjXQ)myMLok*K zK_sSgz?bi*nk4?fo?0Ovw_iXb4te(MNa13<=E z6G%*4Msvt+MLo6qnXf&|_3nFB-D;QAAz#4@7H$KDJybM#@J7yA+dWjHma==`4rp)t z#uM`uMQ%@|;$*B}vORrdI=t{mv6E1WJaZvEuHglxdQlHmTsakp2v;J>2OR}U5;fS#JPB?_THy1#*b}&dYhl+_o*%@%)TFZJXLq#&jS6({p!!jvjP$D2Hm1}ha7$A zepSy82SmLr`R07oYw=fA)OI z>yroazkPG2Dhp5R&2qp}K9*d&Xt=u%E?s z39rKZ#fNB!UCwz>nV$Sj;HSM@;=q zxI7($OC{sNrOgM?2H0N zjvlhrOvl(f?D#Eo>_Qffs+D2*c(C|w#M%1|3zcEIwU=?2`yNsyMc=}B^EfyR!d$;) zyrcOHH%E8Z;lHV(d^WP0ZDar0u4cy%-O6=;gHs4!e#oXC`kT6|G=@KvUZDmA6XL$g z@Y^4z;|lk~e^YgmM+=JS;)hjvlhy0u=mtW;>Oz%3FJ(KzX9}&L0sIeb$3qXRIv2w3 z4aFYvYqJ@qq@!;sozv|3F1T=U3(tE-Ji)TK^WDfnZg^N-)A&oeorueX<^IXN%j2yH z<)F#)aZ+ijSgw3Tedax=>-}9_RR170Ip_z(w@Ld81-4bDFZ;)D%`;R|^Yp;KgP8Zy zYyPfoaDZ8hr_W{-uu}ItV zLH&poqd(BMKdSQ6=f4*#ne&0JdQ?Rk{wNgE)Y$^@7ah5tkJ7|`LqL5t>VNR4D$Cgi zmm=b*@cFe+;DOHQl>b%d2G>KSJ~sszx4cs2S01GRAe7)B{vs*(jwK=jf5Q^&mt8Co zsc8pN!Q$^7kU&WecvHC_%1xJq1>tej#uK88%HuP7Ygi2dv9 zqTV75h8zR!VaX9oMWRn~0*fSq>b@%1-p4?OTq1w@V=5wZSc6P+`k}{QFvHBAc}&%= zd@DN~VtO@c9a&I0h)>WscMaO-PXIbCP$@ZjY~r+J>gzdCOnog&Wa_I~g2}96iA;T& znffxBde|EqE)JnRz~jK*e7e!&(1h;OS3a)lUeCV2{Nuj=r96p#&mvFi<&UeHw>(v9 z-1hxAH`5nj4*pHH`U{F-wUL+up%jp^k#r1E?Q0Dsih~=2+QmVc;io`70^$lnMlPhA z{u9o<9QXHsJnlzgAbZe2?7kSlAV3mccg4U(z5zrLz7g*ZB^-6oI@?MeVXyl0f2!i{ zvM6)hMVS#_6!o$Wo(*0HBc zt}=5HNwf_Tdf+p`=>aUkcE*iaE>2fbN#VB{;VRo%#0Bh3xTv$mciCcj6@+4G(K1VZ z%8?2q#D+TMNab~h2Sy*;!e>KTWH5Z>YfY*BZ$JG?Z`Hi47evTp+;|R&D#Pj(fyjZeq=tRqa#3hunErzCM>DmzkIHX8Q=ECc z%=9A20&1O(YtiEm5H9d8-4t8{>3L^C!s>Z{%)Por?NdKrJ|DSbZ79 zvT}BztPHMioTq0zscN4`$h-(BKtw?3Cu9l?7EBxpy2MT22P?@p+#2hBR3Liw$^NP} zBDO)T!`_}@UvcP_B%dGg>Co^b*dz-3s&k;}ytc0@t!Y$iu89C76;WOKP+wIu)hO7g z^?wodQjKzrkIVUJ^lE(E%SWSA<6}lYRhDY>X?(n>pQ;z4VSyThGG9Ag(I0Kk8w$NT z3;b7wKNJPeyVY*(ZI1%s6Q%A+LmGC+=Ry#{iV{)Ed6+Ux}7Vf z|K#Jh@yCh%Rk`<={;T{TcU{BVoWx08%p#IxH)#eKJHo>%o6T`F*%=g9|9FuA#>kbAI5mtn`Fmx})+^H-lLu`bV z`p`fGrLeiz&>R3IZ9N85mO(wH>piWywH0AC2V?fx^8q*`&|y1BXub4@4FIs3mG#); z`VRQq?t(HWbr;hHsm>|ye^iPHp*8yWAP9QLCg=8O;z8Ou1ek`C@t2+T zkR30~V*hq#52@dAuxgO9;_CwF-qz^94OUEQg!`&n!Yg>^V3mhRrelLuyHdo9*bU%q zL4j+~yRkTlPzo$}2xZy+j4Cw1g9=e(Vd`u+WoT6?%X&?sapq4a`hs=@LWAha5%%b- zi~d?1fFIuNdfTYm>K6Mgu`~FMoneGnKanaMGksq#dA@sDMy})o;t+$9>)us>#C=8|AB{ z-)d4oXZ`Htbz`_-FM7`LKU+S43WYI1#59Txq}#}*jiuW5UN#QXM$JbhNi=9*V9kcY zh1*do4ME0GRO*9Wp)-ae6p0#G5dz`68xHoAx42zoRjS#;i7mqsKop4N-l9YYwZh7Z z#t{7@PYau-Mi%@51c{5kB^LAOfw+M0SYrf?;EWes0OnHzXhY43d826_UpZ8j2U!nk zPrK=(LsbVj7js8I6}+b$qAaxrB1?lep?^XL3_OS(7?3{poPkAhNe4>Mk>kmYF)=@^-Y{KYmLM*)e8~MLxZYMcf0PkKu(-Se_tI?y_ps+w@%gUk2F#`Q3*inX z#2sQ57ZsN%#6sNN6qM9iKrag0h5r1YQ#5LX$_lbYB;xL-^GB%5;Ju7x0RVv!TOr?z zDI%hu9icLHgORF5xvPFfj={;6t9}K1aEBT+UUK~l(B+$P2!z(XN2=m0W^VRd4;90p z1Bw|X;vrDxx!1Gp?dXt4K+KjSO|b`#aYJrXD6PT~g?1SDN&(-b4ZVA$>R2jXCM&#n z8*2}cW_!>Dchi@Rf{O-nk>LBwxm7^j7H8v3iod-`R8u)hl>}K?&~@S{)w+@y90>9f zYjko1U-0VLRp}&#q7=eEShomFFU;zJ%`7%%9?&J<2n^EP>ZAe2xlZ&27<`h6pT-A* zh?Mx`)POfG7=RrZNs^5X+)dxARlANH7$aw-Kk0%FmdVy^XjWt4*f?`Z$_Z>Gqb3qa z#X|{k>G}vrMBnS>BUH_l&p^eOyegeq)#!V9iNulgn)q(|x`EDVbb#KB(uJ{8X( zPGD)Y&DDCvqY9uci@2*sG2Qe8J%PT<_uc%uy8i%=F`uJ!lc=`SS5v9g~tlW!EvnS!~^luM8 zCiZvf-Vo6Hf#+3e0dfXN09X`snpPn8@Jp>jZ)-E{94Req~e)DVz*uEJo1K>V>; zOHX-0MJu=TrUIYToBLCK#omV?)MzhVp9N{^wijWxCyOcyW5IDBD@g6OEg*DPa6=4)(4@QTM~w*j zxGx4mYDCb(U3eB6o2U_y_T!KeO5&ks4}gPDAal*#IuyZCk@Ov_K`5HEDGUuxl@EY1A#hwnzI^sE=|>00 zss@b(=(rO&1i*vXA!ZxaAu8wq{OWJqFK!*HO1*paqhnPqS&3;FxE?oFm0W1F64a|? zK`TMH8?6LOFzK^vT5$3;Ec)13)vAn+=se?y|5nuQC$6qs?~l=o?I-ohBJa{Syrk-1 z@)NC}r~^XEI@_d92o^fiB&R|s`fOj%OkYwm?x~9M4D__wqw_fMMK8rvM52wt@}8!R z!oVlRQD}UEHcF?DQ`eWU-$iK1@FL*4+xVA6pZ^`FN^TUW93%|j82DWrD&M$J5jpEj z)hqPrX0YzuR-g~iNtY<nnEnkV z*PUNRq~l86`(@Rt<3w*bgDVS*w2*mBoW$HLDrG0~B`Je^i>8qK9!&)WZSbi*ixS?k zmsN+By}-3oW5;aR7|k*J$PdNPG8^MFfOU%HS>HcFbx^K126919@&Z*nUI5RKHtZ-S zPELy16q3S-2BS@3Q|q((SX~c+;3#$k`!CP!~ZB6ptyW2w|82oyt(9lu4>?l33$)^GPatjf}Rg z8AupyPlPdEY>%!zMy3HNJ_c@|{WVVINq+?A@srebCEsR*Ci;wz5e`qTkCDClHIh79 z_H*+|^vqt`BjWRCFu`98Y&~zXDy=sAkFU-g|aS`2kRf8^;s*e`D2`DLkgrrl`7?VsQ458M*e6*Px3+7d)k=Lk&lH$;J>_NR~M{ z?+m%8zn=jV;&rud3Ji|37a=1GHUN$Eeo*7se^|eyn5CV9HZ1E9TuJ?5$iyMb{<1Zs zlV(#@y=H6zmy(jVfFOT@Buo~hW53DRB_lzwL^h6(fIQPgK8cSI$hlHapQ_5k{JM`z z-Y6;JJ4s7~a|${{t)o*_q>#0Kk^K!GCnps;6)>Qx=``pBZq>aTUQw+@s2@r6RgCKp zLO=63MuE-~&@~=aHFeKvDhrNha?%^TFD+q~yyX*^$5~RY2Y@}+ZfNPL7zOVC@fXuJ z(lNw*;>9P(bSyjL%$dO|=t;7Zasev=jh%#ObkZnJP-ngZOA4nw8o;qVNPUQIVIzoT zF_LMJaCqob3Zrc-9NYeG?iumfEaGLm{k$Hdn)Tp#3hlO zF}t5MYsN>Aq#=AkRplP6qr5g8 zu=L0;jZxzptgJNZ%383ZxQ)I;={$M5IxomBaCcER-D$dNRGUwq;>q9yl6iS(fZIav zUUV~851XzEo63#a&m&bY$0NHgU8F5LN+%4rhn;8z(g$q#Tc)d8*R3oKbwPC_^X>95 z*TT5n*>(%FvyC_`ew=91NN*tL+(Tw^z@I2$g4j4eBR%XiLq(hMA!;rz66tlMa7~uh zF)d?!z!amoKt_LdU$;dZ_3HH4})K=CO-D02=o2&D{QrW&@}990=)wm$};=wox# z1wBVD$Bk<-S%p%up)Fo}>_?^O91NWkXRbrn7J{f>T33F8SGC-_NW?Yh_#=H!OFaoe zU)GQ1AP1Z$beY}tOLJAhWmWHO5#~I95S8#ysD#MD0l-rm=#RgU(VrpezDFK57;DnIn!in&Jw5I<6^1iEmbi6g zB7=;ruB06SuAsl|siAZad#3SmR(dEC>w!N}g2hacR?(T)`XD=0h*!cE@F5QhFo?id z&a+;z4ANM(%vzXuD`2;N_;uBQ!NFr*R~NRHqh}Cq7sAviJ%Y%lV;F8yK|q^2VQz6o z_hHvVF35O8HO)H-MU{xFMXwCJk0yrH702oS=i@j&44&sUx5uwM#+BwyI> z-(=(5OfwPA1~McM9H8%?uZqrRlqhLRUkWW^%eC1dv^U+cA^0b8n%x42MY7=a#XjrT za=m=M$}4<9*Z?O+kuGQe6YL36dvLyL=<5~L?Q36qW+?{&;LX}&Be7hKeN0y-s ziWblWtTphiz4eavzN!As+}!_oQQJcpm)pfxHOziS-ET22PS;Jhi3!pdA(zK$09xZE!8!$`sW%D zH1~qsNvduPryW{8y^SPkLtni}m2@pcVwG1kv{W{p1b9nh5L0jqipLtdpv7W!uea+}9v|pO z6OYICL2l&LcVwGU>{o=xaeG_1<|%%0(;4MZHjd^<`;xPn^;|th7~!EM;1C-TnHaC-N`)yUb`FoNJfv?5djMx!t6gD_>k>Do1JU4GEBDzK* z^O!euo!mT&nHUKZt`QJZ#4tr~2vD9K+65t)8jGX=4wJ%!AX556A0Wr7C~`B!hGthC z=m)1-YY?>LIM{N#+R!WAR%9R8o@Lj74Pf*N0ZxqoH1Vjjqj&#G@RijffkDN}yECbN z^jh!66l}1Ew(&vB0yF!kId;GvJU_?IuzpODs+g+1;=Nou8CKnz@B&CEerjcbonrs6 z^t9Sjo+&`>P4DEyYFEmD?8BQ_zUTB-hHT15D+$$2?KQu%cz1OxrugX{XQ}=20ya{4#)N*|or~DAlW*kMS&6M2`33nr&+K!-@mv(g8Uaj?g%SZj=w-<7 zX9E6UpZHL>@@UuK?d*~j7)&VnwO<}k)k-M&8g+tpIH6=v|2*73 zx6G4JRC#a#TdGPNz=xmYuqbf^^AF`>OjU_Pc=H=#K~>@y#vVZ0Ui#tO| zmtg0A{(Tm}b;e4KAFRi%R0S8!sBXm7s3Vj~6s$nJ4_zd~nTxmpM36}BgkFAJsoGbv z4X)LcdAT-3UCi!%kcw1p3J{~20ecBZM2IB9JoW);NGEA9k1u0;hPcPgxm;VM26D0o*UnUX}dku2oquXr*Qtn2tph`SKP zXTGEAC6lV-e6i&n)v)s2JPFO9>kv2;K!iNz2uOY{+kP1W2{p)QfmPef5w8d9Br?Z{1`V5=^0Oam>1FS#!hF8lF7HC-JVzlKH|rjJS2ZtKjI8HK znuLb>B3{xow1RH@=f0;}U&l{JiRuTZO{7==IA2bZZu|HcImGw4Q&@BtmW}6J4o4V--ZtL2IaIy^j#@1$yiI zszG={5}Y?MQg^{vO-@xZdOxyd)LEnI-Fk>|3(^D*MHt3NtcRb2Ny5pPjdSSk#j#;r zH;%E%)v=+*F4AJ<(DDqgag|@cFGt|Eg7F*u)~E|Be}vD-Q2{!nHtZ!y7HZiiymYGP z%j51#GbMpPUIN|u5~1E$F8Oj2v3-~qJ_PauS71J+0%Q4yF?ve7I7Z{k0Vc9b+aCb? zSRnT(RD7W7dza_|A0X-U60A2)V8{T=(cl6S)7tK6U{7QQ(>kiv#|F0FO&yhmvj!w2>rORsu+xOw>+hTrb~acO39WaYm;C z8&+-}XX&9_>m${=>B>#nb|JT^+yM@%jwFZJe^SXT&`uw(Q)QFzZ>su8b@~(WVu$Fs zxbT5E4j+%>@b1`K3qu!|H_OIb7m4@B-oo2!w`iX6i%SSqt*hAdA$c7M*f@{cUU$11 zhXL*hx_jd@+PdU7DFZIo^t(yy;uzY{{nx45#cYu=#^EHih}Ob#s{-yd0j@4vr%K|u zit)KS1$#^%TBqvgxVRdB^9?KaJYFS?3rI!mPr}&7ii3sB$P8){Tglh}WIdx59HzSI^EasG7jdq0PiZq0 z@gSpg1o|mZvlMG&DS!$u4T}gCu$~5`<3G@Fq+3txX&Z2uAFNkzKzfX|diMs^IA!?z zf*!hHqpD@ak%>o7FR8-#2Ldngs-ov){VteQo4h_hGFTEwiSA^v3g+N1wqxCYQVnr5BQCqGsV zak`YvN7pk?n5AttsRmMtM{!7#()%}I#3iUUZGXex7naT;Iw;plkor|OHYeA2GuE2?DkX4JiiocJh*WURN=LBDknwGF-2%V_uQiH zY6$_Q(q{NA-BalyDe?%9=wx}|7d|Wt{sD&wu!1#Adq2Zr>jepC#75(=pd^6*v;`Q8 z91|-GLg|-ShE6aDpbVtyAC2=J?MKk1a4x<$0fXM+q!*Vsgi#xk2ZA~%CEyR(@qvwj zOS3|H^k=HkJ$n%9&IVyp!apK+KwXb+I8?ux3vZeWU@oWfKKS-=N-pn9VRa&+U{$57 z1O~haZ;)x-=yO$6hAE>RQUVAU=nPAl48M0uJDnncf>7XqHA~%UOV8||UULd{#? zQuZvMOA*>H(sk%*FElA(0iT}vg=!>H;~q+lJHBvb$bEPkwN*8^caLB04b6f;A{at0 z@3;y?*NOB!EDq4b)iy(TZ6hx--9zfcS?EJAsiUAu=JzTY}w z&JzGXD_b9nOF>6+@KZm+WD-B3`JT6Gew-%+ArxBW716Y%42F|)H?!L?7lu=kO>fFN zvaBPcUp*@<1SoG76RH4B%^Thwc8b$Dhl5knRa^l}HmTJs;a) z>`oPJ@QNhhMbM5g;OYvr2!pb-?z^;N?Lp-rpC<6gXMKfCk+17|Ux5=$(wBav>gDp? zJUKf;01+yP{1dwJE7iI-U#$($!sUvmi{s3dy7<=)l*iZWq?wjKXk$%}|~J zk>#8yj*TO3RiM(t5~=U{#@#tzZU zyp(OoB;#*LydEhE39n!b-TuewEBC0o)5bRBKBHrzzHW~y&>!znt?MpK1#JfKKnOs9 z(PB6l!g0gHv8D5$RFLaNdsSiOawO0);w3QIiyFeXnH>Z3y~_CZTXZWt0E;{7?uhM2 z;j)0vq3qKu_m5ZpO+N&D&I_iEWoDA;nc zykh~2MUjQRphk!mRv#->*Rn$BCNE7G5>EZLG+GMOdcC6-KKN!72?&UL0C z%U&b??VKSp@nXyvFOiVRlZ-$?zB8$z91bbsC6St>glYoV$$}hk-<9e)eN3$n8_#tI4R*_~jqsth*Jm9QOIh{vHfEc&MYy#PYYaNS zN0h0Yz$8pSC>n^MHM$l_Ga#BA3XKnV)3N8V$dHvY@CSruU2#ygrLcO6psc4IRQ18U z)*V!NrI7D=3X4GFz#kqV@Ds#H@rU*uQZpcS&OW53lp9euc9_W$wh*BOKC~nNvBma6 z0U+J$Cl0G7&5i6U(iWv}1UK<4A+19uH!CVXscv6i99DxGO^}lXZ&?9ZV0agfw(hak zErhQD*_E|S4?Ci+^p4fr@KZ3BiG)}K9E&wT?7(rr9@-yOtx)NaqpE%hkXF(#6A?vV zh64pDF=3|XA64O6%Tq-h9-Qn=B`kUF06_twrb8X_qds~Rx(~ro#Dv6fl+&ul(D<=} z(?YSn=||P9zD$e$mYfpVvYgaez=OLCmb`2_>gL8@A$FZdD^_2o5B#X=WXGG~SJI5G z`%}CeQ;#>VyZwZVNYLU>pcy;#dp`jR6Z9`XsY|S<8i8hVpAxt!)&za^&$x+XnSS(V zRVVk9mzXzs>@q#~XC#YVMs_M!ClY?}GQnzwCZ~8asO**-Z2(C88GsZ)fiMm|fMFpr zprXX@!V|9+>Uzgi{YwGNKqO1fXcT6vaRl5%5YhZlNq7d5LTL#Y9Z{Bf1vX|xaYmi#j|1FlVM-Qj`- zQjD`IL>iC;;#g3Wbh3_UEZuEvtp4q|s?&la39tc+J%MmhQNlt|X<$*)nKBG|Y2X(3 zKWNYi^}n^uz(A%A*s<91HF87CIQN}U9k5JIe^K>oet`o7R*=VA)aFrpnf}W!D%_nC zn{3S*p-%#cN#%@Ur?{zdiX#y@;hxY4KEpc#Bmgc(^Wp^HbP^#>mX06b8-I9I#vl5- zU(^R3&2a`>4in{Y06@%2#)HY4+fS*K1$NiPS20qIQ5aG@lalW*Cvh?1M19_`k|1Zs zuc}o!kSmSIbsZh*vz2tuH#>HKS-VXjHSd!PSZ z)$xvZ%Vk;Q$8V$`EX*6;imL?asipwn zc^b>|RW!PEq680t8FPc;W2ghc6qpDEX~~g8RXj4~ja$<$ww}ynIhYGpmER21mA;BP zjfi5hK<2hLp5PXFLr17|0D1tJ+(cY-^!=f)qA{R;!dKA?;C{$oK^4HW{)!?+?2F(HKUrI9eG`v!@Mi5p93rlDjfR5(3QQ3^eQ5$?l2vu$B_0it;98qnGu zOsgo>D!U?EKOCs|GqU`D8mPG2+UrMVPAI?Uyz?omZP8aJRb1xX3=?L>g{{_~F%FS^ zV&jMlLVr9C?nR70HjZ>Nj%K=Na>YFu!lvYkCu;2VW4W1Zzz3HWxM=Uye@>~m9-&k7 zQz~x4Pe!n!9ez3oF|fUQSP<{F=v~2z4uLJ$p!&g3MUK8WwW7Ii&I(QfU6yV_P-fSG6qW9TVD?Wvjayq7&m01x@N68$wWUp>pqoQ1g($LpteR&#Yzxa&V zi!2zMeOxg7k7pk=v%dk}cpXC(^)UY)p^9fPr(+?R+QsP=SK(=JdPPV4Y)G%T5EISH zke{nFP`E`8T=Kl?H&N>Ya|<79$nGWAmDxQ~1Fg_#xgd~=rRyD}@fU@~uHRcu_~IhnX?plmja5G77oEguZM>S}iPAQ~k33(nTV?J?^K(rEM%mH^C7a`T&qG)huSlElSVenR3F zYfN5`Z*>7VT1C|;% z!Y2z~EWJ^nPIYUtXa}aVC|Lx`=EP{TNp*pbwWbx(2qYqeaRIjhPp-}fcO~MP49E^V~N(lo7hNEJyS&5_0Ha4bzVB8PIWtZ!Col{S`;LV=+Gu% zb!IxK9FZAViLp-CwPP?nZpJ}R1UFT$rHGVv1jMN`@|p}BoLOOtayHmdwSzo3wjv&X zs>oe5!+M4C{&LW*cA35>l(+wYN zF~a3C;>R(y`?D2$0URG33a8@2y-Ry z9uV$u+hW(iYkvU9tm^yfMSMOgyo+YJ-Yz{p8v9)mpWlrD;U(%UAy zvG5L20OoHVAm^R-VB@vXog{R!O+!S4*BfS5ymuKz^43lds#%6eGiItD8DM2!t6>?K zA?wxC86p6$hs_zH1V1sEBCjFPZ4ATA#j-n_cB^R?;u+hhWJjRmMQ&@Bx+D{vVVWA5 zDVldA5T^h{h*9vTz~(Xa3f3KdPiIO(8G2_+0Mo-fCIa>k6EU#CWv_Z1QP^hn^>Iy=Kvo=IkbxpR&Yp>lAaI-tL7LR{W`Y=F%TyLg2U$`u30HKd+Wj025z1ov4 zdK#&!AV;*k^wDqX+xbMLTo>*5)qx6ypV-?-uz^1-HpS>$wdjplK*Z|m`Ye8+6ZGYV zeo>2ZMDz65oQqnqH;a1VXU}ZIdR86F5qDi2>Kdj26c(_mXb$^D0)07!eBm>d9Q*;a z%BT73k#q%f1Hl2rlcFkt@=1>+Y6ZjPqo5EEiJT4&}`g4S>exc_Om_6%uiP z+%W33>Ovxtotj4GaZO|Mgda66%foEjq256i@oYfU%~j=zi;>*PhfF)vV4oal>x%A23#ok&`k=3@xT?u#Nll1VWd%E4O!(W>XO2kYb9erS&(p7kWF~&wcA~<%qCRjn(b_0>#c0Qs)8kz1A3?RmpNKCH{J_C@~ zOd|6DZrfiuKK)z$U=0}(+wc&%vbI5 z#pMNrnsTrKXblxj3Cpl$(CQFPn>;b}2VR!sJg_QXG)P~Qa8|$c#p+1D$SC;r6jTJ9 zg}f8uJ#`q}z>yL179=XABtS{qL&Xh2n9EdEBhesxtiGmKa~{Gu=+nzbnXsYzXhTut zL-1BiI@mAiB18# zGn)bF%!Yp2MI)m&DSju^#Kt1GEM%OD0quaB#G6DJ^ceDl@q36dMj@3)pG}icP$>A# zEHX3U$wyCSv8%o9p>q!=4yaS|l_bzv>tRm8+6`w<2(^?*hFVS}b50qiLli~<)pG^r zNTMmz?(Aen3HVPSKh0WjT3QN;#(4!d{c+3^K}EBo!ND+r85|VA`~)Oav#oPM`7Gnf z!RfG6GpF^yCy;KpoTZ*G5Jg42DeRB6O(IBImVA7DNVw)~uGvo$dYX!FA~Mrxx}in~ zHgp)(<)gYzO+*9g8~aXbz`-*GOFxK(Kf=JY!CL*T+RY}a(sm>Rwju|pi<8do&UQ;pPO29^( zAFLhYsWDHCjz)((wPq2jn$&eKm6%3#g%#8QkVYEO8*|b33s2)0?id{A;L>`Fh>p~Godl?>b7!CgT zri(v5MIUpEM8g715!$flk6_4Da!IH;n7jy8u-)Ji+z(obu4+jUSQW;Mch4frkiQ^< zh%)g66ydCQYmplt!(@-qnWpL&i>3{joQM~>K-zJr9CT@|!_Fp>;(W0r>Z$9BMRVhA zHL+M^#+1WWLiSoS9dAwxM1A`{<(t4{Y(E#@c*Gmx&z9Ix2Z6-Rj+K43zQZrUAo+2Kq28g0$ zc35D4N5~tcKG!g=Y=9cjTr4R=(c)OKNy2Vb-a=$_uGSLJCJ}A5 z;DrkknN?~E3h{BopraPy6gWbSC0r_e6yNS7% z8x#k@ja#(gDH>(beD)nuJo*;-_k zy$gFDj9>T{$7G~ z(E`Ljuu;}bpbYSMf6IQX37U2iy;X6vGeoSVjQG?8<%Z@i&_ogUkGl0M&vys}l!^W% zGZTW6hyg`5@FB|f0Ic8SmPW`YMn#pSb9g!`fwzqmtgc28#4goE*gVoDe>Lcj^sN}njWkXqheWF^ttQ70oz@C26H-Ckre zBDYe@zav{25fOVcz%iQ#yApR^fH1v3N0Wb7c)UZzb1+OiWWUnRif17nWOImzI&yB} zxjuq=s>{%QTwI2!CxUo9wTUNQ(~zd%+N&{wOpa5hIyn4q4=Ppuj-pM2txa*_o7opG zi^Q$0nt>s@6#hqROFA;%(^2GNvuAoo=#fvW^&Lfz#>}~hHIi&c2o14D0Pc+F32LLT z6Kr~f{@>{BicU}spH_G3AJs{;YZu7^sjhg31@e*`DF>iphj_Uvhj<%y7A^h28yE)h zji|Hp4Ru#%k=r;tyioahc&GE)<-sMRHoAarkX>YU#k$VoQX}cqMm|x7<>RD&@_AHQ zSJBB=iv2*wF^){p!6FFycKO()bo>mNe|=Ql-BolqO4Tb}MbiXYqU=;!FmVR@L|2gk zi>$YsXkAwI=u&dLiMA>!WJ9#(Qw$0?T?iDf_mBaPAbZln@Wp-~r}CR~vENkvfxLmi zOcvm+*yX}Bn61;T-8dubl=Yk8)ZcNN9#muU0YKjAPF@62Tb>in^SsF=wF(xh?sr7h zLT;OuM#Q(nBbtL`Xua2z-<%IC@uAS|y1>Q%m6Y5_TP$da%hC#H?J7$Rw@bGOx}!+V zqr>YkqZ`({O}%9y-wc1=5Pl-aaH+W4m8an) zV8Vc$a)*0=N_|!WThL8vRpxNNs+>H$zA;>Nu|+HVjIco-!_{jxCdG~F3tMCcKEVi^ zCE!6g4DYgke=-eP^OLmn;qcH&vgkdjGP{ecR-a1bFTL>P{OL0y%8VZcLnJET z1=M!iBwral=+;&eHK^7#krgd?0+FWC#G>vZr|c!?3+V(d`(TZ?7aoEp60X;@VIdAz z%GJJIBm2oGG)%gxhh{Likw7_x0b$i4h&I-(2}V4vA#Mu@aj6G>yeO^A8B-UHDI#4E zX&V*Rf*ewX$6z!ZgYv`9VXd3>q zvuVw8JDNt8`>g2`7l;cH&!EQz;&102c33OzUt(gyFi~GCkeq-h$~9gwA}y@LYR?6t zv|(gP8-8)gbHRXH>Z|n~V0%_|)YYwqMs3KDekp+1u&qC4N_?>SNE5};M79}ts>u?Jol^HFD*eo$i z?6)3|K_Gz%h{j4o1w)69gJ2C*7hNJ6dcW9(;o`7=x2d}>5dr^~yD0(jdu{_Akpm<^ z8lH)%V<2L2sdcQWdifI3H2$fTu}DEwzuVL?6zj5--*G(tHn4gwg3tT808}vOBt-Ad1TL!Et4@YKozSGYQRM0@IEhtLf9Wii#faMZl`Cz%U z#~_Hs*50B;>UbQHMh|(|!KZMm)0=U)Rm18dQu|JYl`_^oQiappQ8;R59gm_oFs6NI zBeIY)DEdw78*w;2BXx<&$P%C*Xs7^low~D+XkwHparNJP>a{*12CLp%eS|+{3_Q9q zU{G6P?U)|mZ+4M2Mg7)CWLs;_L$FRYxl~-&>vRkyzDmrHP zq4wC1U;_YK0TeHo$RgI>OOpxR1(Si+#`u2JWEq*!LPwP`Xd2_7XObXj>{xdMd*vV} z-hKuyn*|Mn_*_&h8o@3N7ubeHKwG0U@Yc0Bb#r20Nru`xuDDL(wR(-USD%1s_Fi@L zGLa8KrG7ur4KbB3?~4mFxMd>*+#y$=sTK9@DokmDefxIKXhEVlwLryPE?UIW=O0KQv@aKh*Euzj0f8O~ z>(|qy2YP?ijnF50Bph-&!ZD>{F7c5GZWGcfSBf^PTZCjmO>Vm!obe_#xinaeb-TQ0 zFthQE#N?|-H_9$Qxx|rWz)%r2cRg*YNOj8DX3)JcEg!3_Jy7m_d!%#m668w*oGrv1!=s#$-LZvOte>e*l9 z4%!<94hS5ZwqZZ4Sd_ItN0=cxh6sZDXh9~Eu>I*FJit0b=lfwGvJV}`J2MAtj@aNG z6ztuHfb6J=%F`it^?HBNa|q6*LR1D6h|Un%!Uo;Kv?oxJ&!*`DHd(V0eXbl`Wdkdn z=hRI=r=m6}Y@-@FKm>a1)ka-DOXl(!;B|1OH>`myTQz7Ekr$ZZ z3FEW&sLBD@xcWk!9w1uyB0-%=OO(%kkOrR`o`rYS>l#s%xW}EvZN$2;${bV=T_c*B zzcp1Wt`XPMZ@q!yj`V?klRM4=HIW|J8CIuP)sq9^3iGg1^#+NcYJ9DzLoaQw744kF zf$D7}CKDuoR(5FY;{EmQ?R4Vhfk7aGo7DP2*v4F;Vg`%CGNyOph1O=ov7N~i5~$dT zC+j*+;JR_OH&O_3CH4mWjS}=XvK#yGfr|UgCT<_ZX#14&(vx1Q_=WCm!gWI=W!ne! z=M;B)dfV${Zb2_QXR6JEMWedhz!>mINHO@XHonj+$+F95aU-ThS;x#$xkKP+b(6Yt z2;5hmQ7eXsw2T{R9(jsgbs;R-laL>9`(1cadxnTcS;G+I=#L_ME$U=0PSUuwyuR1F z-c)-}_e{+nMwH}yh6;11A9TRX8eCcn5^HCwf!D$P;T=>?Om!_q=Csw(c#t|qFu~e| zZF~FSm33{fa+=Wm{{FT&n^&>|yc2r{6XjLUwC7EN#|L=HL&?NNoOg=43ubdLkwtsh z51h=qK1oEq$b7kzn-i*Yqx|!aQx-IkOij}Y4U(FVtzf5HsCH3(vi0$CZ)nMS3EH_z zU3NX}9YB$NM6r@pg&!2pB6bcmME2OI)nl-T8a+1bv-X&d{1{G;O{d4syVHluBD$<| z>n>O4uH9p!W{+X4(>$4FUikla6d;eA)Ez>!zVI0nm(9k3Ag~c)yS;vlDGB2|>u!XX zIuy=;+0j+khJI!5*4?*P#P`Tz_UxppBSK`CMSjI$3XG|VJ0mHoIv3>WVee-|5*dd{ zjzl|`^${)v)kJ9Z=O@lj#7Fg_Nh)(jX$b06%9>#W)FTr6zscX}xjpYZ+6$10qPDy2c{A0;LF~ZauSN!;#J;391hEl+vpN{&-aG=TRD45lzp5wcJ1vNkD2_S z@v<|NL=T#ioE2--DP3YEp7fMek52eoeo23?O-WAK)uG1_R+(hag=XRbs>R<#m$K=! zV88PP6ovEf@cM&5NDFAzE|SwH0Co10JJR{!qW$s)TsG?CZ&-}@+dfJ{I1+mu`U=<( zqK3bNq4M{KUaQCM!}k3B*yYFahjE_(Z(VA$WEjxb8TJffoG1(2?Znex=DQ%&{wRD- z%r9XAs)_lfoEC}tvMBpmO4O{9Wl2;#AFw(#|6dO2bPXSBSvfsKoon%g4r6oKdZi4k zIP{v$GBp?|@z7U_h*as(UaXN@&*kEz8t)M=p^AtgvhCHnR{Kz#^`4s>*MhQLH6sMa zNjxx;n{fMv4u%!mQsHgxz`^0EZuql8Vd`BZ%#llOOgPg z1(}jG?V*O-J{2k^WRxa&ThoRV8n{xc*Wx05^vWAM})KDVT z1C9X29}>$9)p4lklv^ztQv-y$>a4`-ZHfk+CHMr6X-?H3p34I2z;IDe_DK;$2`H@AE;flV z!8Ze zBf4N+M{?1bgh2(W)MGb`v@(a!U=*#n(M&x&d4U{4DbM3Y#OG|9+L*SB5qJ*DHfA(l zwcUEtJIQvUy&R!w4N$PKAAdI)A=$wG@rFooOZe4c^g8L+uaXeM%|!k(D)7dE6jXrt zGF*JGqUsP}k>7UjO0nz0=~ln}I-kCgVngL#pG8p}H$Wue*EORN-q9|nYPr_8sbqPm zqUS!LqUGV-+a5~Ads%sT2<+#M5m4o!rj8)GAc}{+e)L@u6)z7#xvUD|F1ZWT)-Q;L z2O+yW1lh`Q3`%(zm@V^C?0VrYPDWI{Wax%Y{||jdG3=^AoBc6;4z={wS^^~0$**Q| zKt89BOXo&HvEqArbL(&5IHz1VwMk>f@j_o1iw$)&8WAtl^c8?FA($i9Rg!4#V?h-{ zAYz-6fP*^lbp$r8%G9>f9)U#2>IE)WTbG4AvyQ4$w+f&6&McKVLR^$^Ezz0*%bC4@ zqq=#7XwcM=dVL1!fjtkZA!^2RL8-MSI+JP*7~RY9-(FRDt4LLqBZQ{~gx_!zA8m_k z?s9cF~l$yseQML9pWQ%h)w_3!L&gwQ@ek3lakX#(Zh|E+Kq?0<#JpBP<{&16WjXyWQRIN1_5Pirf%@0o;`J-4A>|c4fb|S# zm!L*sl;P`zGnz?$6ATyBOWotCfQX(nPwv*1vdVc=qM$QT0q{?|a-Mqp9^p6fyXGF) z8y3&5IDU`lVgh5u_lXtw`TRaH2S4}SFP0cXDjNMu+-t`Dn(8yXzs8v{sWrfA|;VJ%tf%wF7~R8 zvxS|aQK{4Ex&ofM+_;0u55|dZbt!g{{dQgJ*HpWF+|npjcRYN|$ExQR;EcmqRWe=_ z;%E4HF(Yq@6KoTP5(|fA*s;j8W?Jw+WJx;zF>y!jF8|s1sX7xxOeS?}EFD|Y-Lg$O z^PqdyZ`nD9vfpzc<9QQAKN`Hrq5&X0QP-WSiY7w(eOgsb7HR6ls!WaKp37+J{Y?VQ|J+GEp=J1%5D5oL?Jw7%Yg}siu>{#Mf(*=$^WcEX722 zMtFD-$4Skf#F#rL)HEm5HIp>~o)zkbpsxQpcoH8Md8teo*cs_dSY=BH6V3UL!-?ca zb<^Xp)QnaAr;5wtV|1S|tJNQmiyVB-nHu_fZLX$Bi-+9=$0iQp>47-{2?Iy_E2m-< zKB_o56+Yxc-p57_IG%$d+@|ykEsoWUlerXsww{Z}M+ci8B5@*D+iQ(Ayt~~{LC};o zh1DVp06l3D+WJAgHb=B!#@1csDr|TCpbDQu-^MBs$=?TuCK65#kvKsWqXjHH=^y~o z^6}XA)c7Yw>$KV^q}gr#lBzzqvum1~+dC%aKUzj6 zECHs*&k@OhasC_-eTbfT0aNYgiX`xp-gCvIB&=D`C*i3=^aFAxN7mzWMF-;fQJUxf zhs}5Qg&9dSuuU2y^F6(a6Rj%ue7L{7tt#*AdIocfgLrB(P{1*5L0UYM&oOz473ztBHOcTk70t*0LEuF2OyvPX zZ@0Z2hc)ung`k+sd1iQx3_)|YZn^au`P`s9uS&eHYpR;D0OJxS{{Oa%7prE^hz1_& zr@9JHx9a|}^}{3~**YB+z)(ZLL+?R|_!}^>2?}0uGrMVU*Kjw0o*8;ByFra$9Mxz- z?ziKZm4Ie;7FI7EYTxrB<=@PzMkcoBna57X4FR+(p%n?57WB#Cmg=%aSjEB^IfEUX zuNp0ebo7You~>}Ht>(lIFj&1DfdkTms#+|%*P5)6%Xo~ITSs>4(;xUuSn<>K!MO7zZh;RCxnx||owq!nVA|4guGvBXlZmq=@bn!5t4 z&H?qx3UN^_3W=Pz5#pt~bEQauVnSmJy#&(LA>y}wdy2`yItmLW7! zKdcg^q3l|Ss43>wV2hoIZ-;dku&e)+%*wbIU}A+hwcEjMdA)I1pDYlKOK*Htn(XnW zg=y!?Dr+mQ?Y66q(S2gDejxuYELh$hWNE|z{&WEMk&r8(3okLHenX!k!)|%CZ8dhuan6pp?bU|+9!YhM549QO)()s5V7_*xRiT{n(~tPXX=3$=#JXG zFvp?>c*NVk98SQuz{}zuul`0i;Re++FN=GVr@lm)Va5&mVrXfKB^yecSHwe&|CpA8 zF9aUE#Qhj`KRJg|PouCQ4GQ3n9aMW>ffMFI)o`5{h_l7z>x7Kivj9cW!l88{KkJuM z^-vG`^B%=>!mcKIr-yx)DtJ{4iyyO)8seTk`6^Vi(dziCqCsau9mWcy1&(_0F#Hg) zwLl`px?&n4C~!YY9*idgLG3O)_Qe)Bb`vgLFZ>wY5$i=k-4IbYWTh6Z7lHbr#0U!7 zwO$m5)2k^+Aw65QeNAN4+YM?ec4cEnhZb-*?pnP5HJl4uqb9v3Qeux4@-!Hwo_h_U zVvZE5Jt)(BH;Dxtp@j8bHf+G!gIV`*5>;ZC;ofp0O3Gw?rW$V$%gh5g>f;Sqm_Jj$ zZGf_JTxD*APsop||3=tK?pNg-VYq^c?#+#&IsN{yQ8Z2+odnlaQm<&%!wZqy7_C~p zF4|C@n_d@}G&}lJHknz`4S4Ec5a7)N{>xAJ#J`kE7QT3l-CWa~3<; zHLPw1G-Hle@5PyOqMwpCur^FqH@+bz7*D7l-VmeX-x;6di)X4rY=R8COXY7C4byiSS^7ME8N8P$x|IpW5r^}YVzX#he-}%> z9{ZU#;q;}O#du?jYWJ4NFN=g0*6C{4y%P-LpR=c6evovAy^$f{_J+M~RJ=8WY-~6w z1j08k#rPw+--3ILN%PY~6g`;QUQ0SMKG7e_F@z3fvXQIIuReQA#HU0wtFy7`D-cLp7jhWQ@T#>!=#MMP!yuUX)}#Y3W18>x!5S*#~3%F6x2( z+L!1k`fvydcwOkceyd-fcU}+c*Xhpd5&impxrfUh)vp_z*JJv1%*V0(wd}Zl|8Pbe zzgOwk)1QGmq2Uuw?u}l4{Z7Bma9+RHugmo-`t(>XAIbqKv*QbU^?i~}p#TSZYlJxDaj7&>C3>gTN@GkMJFG&{;Fr5MV97WX*e`aD&zO|(p# zj@@4(1u_(aDcWy*fooiF)O^G?k<$Vn0fOBehf(ktLxC;A89)64mrPnG3^K$cuFWui ztaYb)b(_fWuHID#o2zt!Wrf7S7C|Q{?jyf*@S6 z$BP>Ky(3yBOoyiq;O<06LDj@}gfH)B6pp6Cblfze@V4h@gYtxW?;Vk!!|hTgtW}r* zI9G_Bs8TQzV;F#_`>tqGR^9Aw-Eo7CE=Ac~KRD@JihqML*n7iTVa-V6AVxKs{CHVi zjR+K^(>fS?I(kh6f*8Bux^MwxL|p-c_T61QG3X0oaCRM8(S%(<0+X98)R1qxlh9PR zo$0X;&V@jOWP9E3^{py*fMe72woSyQ>1}<1L9$ils9|Y|Z&E%`qt2)D-xF;!W)<-* zPM!driZP&%(2484CSAc^rz|;77YSVjSaFc6E-Hyf+@AXjCX<%2;cY;a^DlbCFkp>< z7g4=R(FlR}+Ezj{7@ND?Q0g2g4d?M^W``A)_`-!m5nWNqgQKjsiqO~%1itGlD zf&5$)`xjeos>Nf_Ck}%%e2?uEm&Dd3`ir)nt=PL$Tw|y&cjCy)uojQGXWLmGtu#!&HwzF7#wg08f_A)XrK=pc!?aodv=MweF44} z<0IAc3-NwO#}`2H_No7NExBgBQ?P^P(hMx&^m z7CY+doV}to*_SiF!miY@y~4uF6Z^!V|AoHQ5B1G9>Et#JcK?6TyT&TvE0N%Iv5n8QVlfBba-XUx)4_B=YiCf?#KL3!&FlVHxdFG8iwfm4r zi@Op2;=Ha^%>Gv32DcRT_F-`vrJbW8Cyt2Bbas`;%%^pf_zyiLSd){~{IUykRLN0s zdH$wc=0*e#%@11ZT-MFF?Sgv9^Bvb;uQ`g-qC?c7qr#6L?=c95Lsa20(J1GWH?@Vp zS_o6l#h^bD4)Oo$UDdWByA|9buLQpMqZP9D8rC~Sw0U**vSiIVCQ|C?Dj<1KW_9A2 z$WO1eO&>Ofsp8|JDXyQvAe#Wg`bh2lPNWx4A%)PeDxtaXEFp6<$vY$mXc{vhY7lT9 z`*Y=ct6OI7=VM8J(f>#Zgc1)a3N^UMSgrOP7bDoWqDr)l=kHphn_Pt;VU@~0DVpHt zXqCun9jWdRQwn)$pe8~D$)nI!3j(mS;1)Z(1<59zPK2u^vxB<#gt)lvf>=_>pkhMq z$CzTmL(3$X%n~jY?g^tAJsAsS!BUf>vQpB|=nm+C%__cI6H=ZqrB4n1PQ)9(sG;A9 z!vA;CTleIDiC*9TBj`Qw1E%X(mGq-%8i%omHb6w$<3}-ss8)wxLBfh3#Q^%wLhMJ% z`bjhigkRl$qbB8&LiFd9%e1d4_wk=Z%Op&QL_HxALlZ*n_(`mUsbb72u^sL#gHMYf zem0)QZ2w;EI}NFFpDOxUbW6cf>ZS5OloBp8h6mIM*L~~MK{wms}L`-Tnn&P^_2kWYR-;4BYJk*@lJZ+&fxls7} z-^Ac#-8drfuyh}L|M12O4ajsQS=|oo{hhY^adCU zy7&ea;xZJ?UU=X!$Freiv99v#?_w43zx)r;Kl`k`BYZn(RW+$16h~KbN`@&V% zWKa8-9E;lG3^}+7kCm_1SomlxLW?g&#=y?LnrO(h^oYj)3og?%5eP(}2sRu1DXXPS z4yzqu%Kwxjop%m~Pr^VpVpZ1Q`*d3V&u32r-yiOlkDdhyz&J)gJrbD*$NKNGw?f>hXMG)mGqMOugM>-nq{H9->lnDxTgX5@u5kOeaOjd1W|tqDfi+v* z9V_#VJ?hC=*(B=lj7+3#ib?7E%cA zsnypWmx1w3o0;iFg`MN1uiF=KB)nt0!d^BDtt7#A>}|`ZiBV_|On&&{@}maK?q!e- zS+v6kPJ)l%tT;K>H1`)(bWV_Mqm2O-x7U}JyZvV z?Tg#_q9&xt4#l)fpd-J+bl?r(Ttfgiqnf3cfL>$mMr8MZ4F;iNAe;s@E^%A^Q_O5*SB28%+;`N_L3!)>>RWU2AQ{jwjO{o zxHfCYM85&#?VPCkX31ga0ElBi)&K}gkpmDcfDS$$NHg(|p74Qx>3Q8s7;ho`*@ZIai5ywi9P^{9mm?eEm|MFX*&unl>4%dMsW*t2 zM#8(>x>?p1g|2HMh~#sZnoksf%%K?32Mx5KBCz#V(iKNn7SH3d5|Yoa=Zz z^h5-#hrRX)&za{-Q@edKE@erQ_e_daKl|jh#$t6@6B$s}fi89OUFg#h$R$KNujUf% z-Y}9kuUyuTxCYPwM)FlzKzPjAZwGd3k8O zQb_&6z@MEQp8OD(#Nb*{aXhMbBPonG)bd8MmG!vACKT*K zZGy?zdI$k(^eY%NG6PDK+HPPT@G8odKn&=yBbt8TwO-e6}t1*%#A8VL*$Ili^v${auyLPz>A1k zLJXM;^KKb}HJ}eHR+)&iMvrucf%4lMU@6!2@jD(l%!YM1r6{x%Q9fRZ@W4xv`mI1- zuF1Ajy)&p(&2A$1_9gQ4aA24q(TApC`W*_~`e-v{H+IOk=O8jFv$;4BnBG#rBpnnW zWk1r`r=Gma*IfPFw3_hh{VCx+wx4#enZ>mLZQWKVFZP9~DVnG$8tVn|gF)In!S=P? zh0-6QF1n#$p^7V#%`-NEQ()QBHU=y}v~a{hK;NYL6-g1Z15|)ReCnNMGQH`J1dt%2 zDA37b4&wrg_y;ehStBSZ)*8XQf}UcJRxu+<1NBc3@G({&COCM|{ zD~simX+JE15kb2bgb*E1RChx&**Wu_&uB{#OBev6-5-L&=0x>!GugD!4n%0X2*m8p zqBRsBIVbAdi_>zg$jOev+NwEs`I@Qr&1F`Ic_)EG{X1~skH7_BNN9Waj&|xom1|QjJ^4J0LI4Zh-~ukg9AUv+#3-em1Mvmh#H@O|OLg7;bDS zM>Bb;6@;o_B4;${xBH`dq@bL17*y4%ctbN-64@=aDHu5~c zv#8`gSr6?h<3)E-dsiJMj5pz}wVv{`|z&!d&IsW<;ra?PXESv_;u0 z2^g2bP;*0jd3VfbqjO-r4yutIWQuximODXtI>=!BhQ-;ahW!WdL$Gq2`lXx9$Xi)^2pFlpc=V6i!S%LGjmBES3sQ;f0AHv_OJuXO zO88b;ON+^@8HF_!#)08j!8WM(N@Q8m>+fPLHEts-;yHVtEz{daSRJv;+14Bm24}aA zw0=6;JjUGGm|F`R%pL;gpe=iLzd68iGsV)y5Y);ZGHqfP3-IZUE|jcJ=6Y`HE*ll@ z!iYjSgYE(a_cz46M;EX`k3Ox!t}1%!i-)qIaq>oYd8M&crJpZ*5xWSUFTY9}LSI2K z>ApHx;PDH;u4^uk)9M`mn5F>H8L8YKTqrM5JuZ~3}J>&!4SGcUEhp&6cOWSl801H98#y zR7DX2hh8KLu^ddjNRExC{yHp@HA4FUgO8{Yx9(AmG_goPsYYX{4K<}F*SNl? z92>(mf-d{^l6mUUOCijke$fI}Uc6LJiJ$dp4)Dy3pnnRiJyQ&kNX>t# zFk8LTS2l||g{c&WI>2ZG#VpH*CgGFFA5{jb4W4y!zmBISzOm zdTh&RJ#g~kV#`w%lMHvDB>}kQ{qH~ zG8AwmPAaRzrp*4?IZBJk$EgM+)KG=kB}1F@e$iR@8V0gCxI@tkFm%{ZP*;8J&xIB@ z?-H4r{_K)un`UkG$!26iR5~^9V%Z?CKh?M3ob^$JJG#h>Ya07ul8t@cKdWi+U#sbv z&y)Dn_E}+S+uv(_SPYAY$A+p8r*vO*2RFD5ls?mb_xmKc0oH(lym=4DWvU1MNNxZx z%D%njRi5Q=bW(G#yCqev?=5pP*S?&B6|_bv5^AZ`$luRTSM&Zk)LVqJ+4CWvlYUCK zeb{StUoZ@0L9zGiz`O+}!q$JKF6<-o>eozPN$LOSBU@fg!-mnXF0#_V{38?88DCbD z2?k#Y@~HIY3Fp01Bmb(ivK5(U2J--?5nQ6R%WQ{ z2Fdu#w;4|K#IP!<54TX7Plgy6t=@)xdRG!h_2hn?*|WC+g444Nc%%-g&3>8GH}r<7^C#Wgf-+9`s6fr` zQ3`ht58SpnI6?{Z+n-4i)%7HtBtPgo`$ zEXejpg~yEsSY-``UXF3=I#i}#peYTmGI2C?VD#0w?U}XEg{XIEz!!~un3|L~bEq6z z7HI=#M-8UtFwNMS603<<-y9PuEQZKXQ{0)ff?FPGR~;eQ9&&D~Y{7AoAr0&^)B`uk z^TUJ`O&zVgN#@o}`S~VUSTm(%scdisO+>Qk`(m7lh!u~HUPbdnB!61|g67E)I5f4^ zoni`y9(_Xp(x7=-TS?g8BFxfSEydz)oEo4}* z!4S8oxZ$#8`gl(r7X$@9Yk{~%7PLJ2d0SmRT(&cAP-BP7tPDgR2Yr(dc8lfn{IM-iKJeU>jBFu*w)S4hyU0HoFM zWoCOfs+PCNBy-;Ds>dzzhVyhpYFyb!7IHpz^eSXUtKpsyj(0%TH=Sg=o5mvxTv zLK-%2g?;%ZRW)>Yidz5GuxK^nR+*YUoNVt>G+=beYXlzn%SXtofFRFEd4+L{8Zc5eYOsR0QQg+hxGw{gfDU6fltwGT=NeW@ z(0!@qkCcU3U&39WkA5x13FrQ(aXsjPt9|N`+aV&)SI^&$ou@Zd;vKLA@lUE6a)&I4-+avRyxXZJ-J$hg zSmJyhL`DXW1J!LXuq#NnK?<4Ap14!mq&c6f(ihS*s|EI2_?!EG1cH49I zE}y&?n_BOw&+dg}^nW+R3u3}U9HZX5PsSPLYUh12KjQEh*Z_#(EGA9b-3YTj?sD5B~z1Ydjpv;2r7HD z%;;C!b{w+Mb44)8;FywiGx^4o9hs}g*$Jd#>~tz0B!bTd0gtJEv->E&$VnyH!9YN}~Wis~+u-qZAl4^rR!Mk26lS4W#Ds~PxbY^oKDbBECcjlo&!~%wb zlb}%o7wxN)RKIeW)D@X=Cj)IFU~kya{_P8kz2DHKH+q3GnSq~aa}DF{4B&t>b@OO& zv76P#(K4l(gBdt_5eNm=R-C=Vc#vXAIARY5nnn!49CcqgwwrHKE6TyPhO0g0@`C20 zjXH2NKont|NiZm+FggQHKqFvU>@G}Po`U?~B(?QsMZX7RwwdtSceurku0$d3If}2@$t@q21=Y!ShmuPlj?8^uD0v-{>xb(ur*)Jo zuRAI-{o!!BtdTw@oc`h{*}Ye|p7Eh{x}(TtZ3mURA>v?-4Fa1OUc@tHChgO>{h77@ z>U{@QvcY7sD|tkwrcmv>jY-OPj&QG57klYeC^+0>`x6%~ z`ix##NMP_QE*Jw}r9`^S#$FjU44QZ^?|!xHQJK?k?bfGQ=OjyWH0~LK-E$$5igD|P zo1gS$6YG#>(;u)0cm-iH+w=4rf=lB*R3MrBmF;C)RpwY(oUjZZSu?d4Z&g=}l`qv> zOf`UZfjN3wyR{-`oSbLiGUfH-p@L2yU(xL`S)blVPm^8MqzQ6-Vz>zyOqOk}XgX1@ zp$z*b$=l+|Y(@sQ+2hsV$?|t351JyU8apaZOo6DTtIbnAr^-pFTYWZFK8tUt+HKUT zR;edsUV?)Mr~v@@^(SP>wUmP8#DJ_#P!s%^KAvH=d1rvabrOs8kdHQ9QRC%a0XeuA z-8THO;K=dlqk~)EhJ97^@mSz!u#)elIG?>h8*s-FK+$%$=}<4{ZB;i+ms1Q?@zZpO z2k1>;rY!fUVy{nKR(?^MdUYoE_3~NJ>CLrU)vdE-;L85KI^+t6%e{V`!Z#w|2o61I zw4cNi4X{fOD@lyD3)kMl{ewmXu=`_tv4}uUhdE;4YXuepIKG}OCz=5HA5Y5py_}2` zhLfdHaFch)&KM#FEY9W~rHm^g6gWuGHT4eiDBLCE1b@`^b7UpD)pD*JWIUiI%$4`! zEn%KqMSXv5p1iGdXz;PnJI?T0QnQ}{w4hIIUp;$I)y?x|eolX1qJs~ET)cFrT<#LH zggUl-zHDcXpQyf>FCX%cpU4OU858`|^_y*k;GaHGjeAOFW{%=TlPFz_jZT$R-TJ3w z(=sBG8Xc!G4$%QfDU1t*mDgE`oREr%dEZEmq!2+M}^xo782?;PCT+nz&5n z;R>x4%Vg)WX^S#I!w(pkz@QP*R4Dd2_$rJ)m>!t$ruBZYeltREyG;aa3f&1p!S(Ik zzwurQ^wCQFM5^iba3Vc9Sl+1%oM0W%?jvd4j)B*&&Dw&29Cf8)yRRp@uED- zW#fKTx|slu`jj$MIMJn{bAZhvqXG7os6BoP*G^;a^vuiX;x^Tmk7TnUOExC}wL{_W z3rwvAWSG%-T8Sr|n%+X7Rvvr7)5PRUIX2Mymhd|+!9W6OJuL#<dNi1 zb-REIL*p2d*@BFyN!}g{zCpEb|B7|7^S!wvDF?~uJ-Jap9T=SoSa}`V0Hx%jRu>FfWk*1nlM;c zFc2l?v%Rt~;G?#PYPCiX3Y5Z2I-OwlE>*|Bl7X_rTcGJ!$CCY)ee@eQV))__CmSYc z$1tzUU)SC~Ycer`dU%Plcj_0IXm&eK7*rifm&~NV!I59}R-c>iP_xS&`v;^rzf*~RH_LL;ZPELcW?$~R#(&^%RVLklw(Dz|Q&x>)NJg<_C5yH5OYNN+vGv?+Zi%G@ z)kh&@AlYQwC*kF1;~8rC8pGOSqV-t&T{`%WaNY+o2s|O#(VP~r7|=dl;&O)PIVw|k z9gxlIRXP!oN$LaSzbsM}2joKc)Snlr>%Nh>u~isJ8-LWOZ{$VrKza8YnSaSgxio_@ zoEQ~QJgp*e7_(RlAIQcCZsN?gntjB6J+^^;@Tc?9pL~1z1l9Q8j$r;nGMk)z56MPd5RwL0+5*(7!cw%p8GhFVW>q1!VexyikfQCl zajP_1(%0ZQZ4WCe5z~CZv)3=X5 z5ja2r?j%qPj>wJ(@UrKKOv$?kw-UJNzBeE%kf1RV2V+hwynhkM83^t&-5)zYIfx8rtaqQ+o0h2|*`3@2d{I(c^QH9?f7{b>~;Z!d^k zB7FAgMan!T^W8*0O^(U)+>~Z{w2%RuJCFFCKw-Z0zYfI@d~=H^_2ts zJ8iEe=ucKjyT`7yw&rTL57Fm`fwkgJN&8Lhm22;tP2swa6qX{A#_nQJ4y{T)#Qi|7 zXad@_-~TYtf%D!IvMB?w_=L=60Ny$wd$_mY$c6Qt9B90%hJ7bHVUQPn$6FLzzmvX< z&_pIG!h+q_JXJ^o56rv2msh&M8`Qw>WfS8u_3-!bIN7D1`5sDrfA#72GOG-{kWJMz zJ7McJh7t4l97k%fx_}9$`Rbt7I#@w~TsPEw92H5kO{_bHzYdMTK-}V(MyK`yRg+P6F)UmxynPv?ysdkjCW`0j;|Iq^w^s|0TMTZ6#>u8*M!1V<#Kv zdTcB=&myC}fj+9|PRat$K)RG0lIlXZ`V{wTA{wrEV$Dz`zGd!Bo= zL4SliS%9_?T4tcX{<-^Azq()AhT93c84X;8GZ@yk=6ndzgraRK_fPUX6E^-1Kgq2A zm2si*gEvB3b1DQ@Um~s>(9nFWkzWhcdHUlk8u=km3GL`QVSHP2_1llKqkpgVR%r_s zZbySrgJ@%b74Rz!aixkrC3}0vO{NPz%BdnX_!Ok-=eXIu@QsYb>J+aKdW%X<1ZOiw4PAJH|&VJK(8-@_Y@Dj~ji30fJLvBtR|r(-Q7D ztkVPzOHtL}fIy(e+&vOI64u}Vq?)$snWwJKb0hGLy5+P?Q0{v0BQFgS-!LC|d1N%#c{$;d*Y z3hgC%8)3=BREB(q9|&0}^mVla1(xBY!tlFe79WXGzPvlsxFO#6Y%p+ zZs84wb3Nw_lU2 zZY>NZmhFkdFd6o9PaAZ6Qy;7g>8{p0u*u}p0*=#g$n@FRXdnaBJGBno*J#2Kk`>Va7I9Dv=;-|<8$r8JEwKiu`X2A_h@EAZ-!us}ItFXlXTdFGo!^V~DX5yQ zx{#mtxpBsoTZ0u1%d9Jfo22I0UT=D%fV?NwA4S287^ixbR~$^ec#==Mm4W|)>|;PU ze8z!5og#(I~d)b2nxn`8i6Pz0gFu3 z7zu~Uvtu&o5BsnH2-L39CS-b}t|CIkc%zOT9=n#2GxgqP|n z%Upk2Cr^yX$%IX)5b!k1k0;`snuF}>O8>l0p2Kd2u*A--t`0N*c%oJb+%#1%67Q=U zTLv442_=#u2v2&pn@n~ze35_>3^nIpxKijQ&h&G8hY?|v`$mEW_EI!n8Wu2i&@jCM z{aEKzqgKI;GL9IG>3$%MRyunnY%8b++=v3*LBqgQ+nkt5OBQLhUJq6!T>4IwMW7H> zdHe8FZB~LR?6TW!;~xmB3epCNmXTe;Aegu`05q+%y%a;pdFR@gb<9<-vk{x>f!*4j>hcJXoTL&{!7RRs` z2w}2h7~vmNZHoG|b+Bc}L%24cSAyFz%@VK{pyfOyv@f-OY>{ZX42&tOBvg`vBAX%U zMQwb}$Wkk>GorGwR>C_ajM-Nu|FqPOjm>Kiy>+$HG zRLwgFb8)KfQv5W)MdIYI0?NZgOXBhI&<>|F!7xSks)?P0>BdyGxO4D=1kLA>4{Sl5 z>Wp#zLZx&G`Wo+Z1BsY&d|V9*8Ez{kOQf6FICw9pn-f*bMX@RB{TZd?@pONeU_soq zysc}3SeJJRHcwcS7jTD`A9bipFsJUCJf8cs8XDAUO4nfX0LfHDwh(BcvTEUl?0_?7 z;d~kbMIzsgU4vJpeUSj!3fE~t-o!10U_<1sgu`SXb`1_!gU=5ZB)l3AkuFsC>K^3*9(PCQ1VZEipzn zOqeRrBiOWT9tT`7?R9$);?n0{Yn?#s5S*)dJjMoX>mbrZu%`X&8(y0O&EijUBh$id z^``yw>?qJR+O@2C23ynV1t#?72CP=rqb39uf|oZlfH>^EdN^8qFWTMknW;>s-iDwx z2X^q!{qLyNo>SqY- zdZ6u1%GVRv{r8!zb7T<!Bhvur|?hqWcm9sOusA#vFq-oW^Szmsg`n`q^)|OKf_^ z_+X=&=z-Rri#=sXAFtGJ=t2yAM<$iqE12HOsf4b^d~hVDr(pH_7S1@qJ!eS-f|zXpS`ag)}b=13M7{?(4asUxx@BURlS zf|+hqql#__22`WILCdV1q()pGZ18_*dk^ras;z%`=1lseoHSBNW&+X^ibxg6K`GM2 zauq2Go_$aPSHSLjy=G8EIzwH62tiOmia|;cDMJxaDG@;*O=gcI5 z_}=@x-}8}&IlI@j*Is+Awb$-g>NU~0Ix3sV66xiW+*{>dz>2yeFBr?-(b>*K^oJRY z5Z-%>Y5x8C$4b#8S!R0Cq)KHZsd!Pz0}trc z?aGdcX3aY$R;pQg12sRSkBH>}z;nDEjqj9EMQd`Z0t}dCsW6_j=OH{X?k&QkpeQ~v z;m}z2syrF-AO+iSOIxiBRe*_i4ueTj?Yf$8761jflOZ<Mi~YjEYSN==ba1dZyyPOx}JN;0BuK z($(7sxN>lyM$fNijh^#n<}A&7wu;P^g9DkpXUxprlQgrJUPJNzSVgnDR|RZfC{!4B zXEmFaqj~(O_*VQ;IT#f){!lze=z%_Z6UFm`S+VC^v-NqJ_nRsTsT>?A#QU{bhKzo(T3XE6j4s*Opw{eZt?kL_;xju<8YiJdN z&8$73`U}8lVqb6evyN8wNflWu2M1~`E8)D^r1b#z;Xm)u*gj2&s%~Fd^3D@_h9lPV zad~A{sSf{?le{vssHv`(DxT#OCIA8W))#uMYQFcbT8N{IBuJR%^mrJ3xhS_l&s7e1 zXpPY8D*lOdOz3%v?>&k)^xFJwW$3k{4|v{{wq$TX^U?ajpt5^W!-0BD)l-a;fsz?7 zqs(G*4bjsSzlUBMsAt%R)9it$;`XjqiSlp?t1xf$$v{0T#XtU}ET1*Pz_yYU51L+b zexROX=jJ6mZ8o#@)4EGRp9-JR1;R_VKCO4QJNErKpN2n((dJ&pF14Wu$74O?LY%rEBz7q%QInjZ%vd2RVoXIN96?TvdLqW-YM%N7hf;Aex1rV|ChsekGZaC2HegP!5r4__JKc}Cak zdfzsul(GNyYxCu?Nc}hu+DbvMMCZFHdZ^x^MTI(n=UE>FL@JL%2q@7&ewm>((dp#9 z0Pj2_whF|JuHP80r$m)+o|HLEf1>)r%B=`^tyat&rngu8jln$Z;yg+0;7q3~WFq^^dS)Y8%NM~M?BX2! zEzlg=>9(NqKWq2v9YEJ-wRlqII$sstkKqnrz)oe9w3RJPK0uYKPqh~=E_l!fhXH^1^O!;Xr z54$)|XLfL=DxpVa+8xZqF3!YX&T~8P$PC{HGq8&@@b`ZK9+~UMU@mrXF8*>gw*!yN za3Pq1U7UfxRRfRAa6OoTU7UfxRRfRAFdcJf4l%np1An?{s=lPKbh^~5g~?BxxA^hQ z69_0UcNiQn%8p~R;De~STQFjsQ>iV9&U^Xr#kjPA4RR&0L%>=B!&a*TvQ52osNx3; z0s95ic4xA4d^pE#fSD`HAM+ZNF=K?D z5bvJ|QlueHagsX@bya$MB)0xRw0op}KkgJ}y{UJ^B^TpOJ*P`=unL$X)X991K`r3- zH$rl4e3#erqp9)87ka?JlYW!QtBt%R3V!LA%N)NX`cr0knc$3{Tx>!+00^(Q;|w_cVF#}z9u*Z9q}3}zJE9-LftaFQ8J zzSs5SwA*vVThZrV*Q<31L^E*b+VIS2g(5==ShRiVuC8Fk$}@cF+n2y8i_Eh#2aES( zbjhYI{EhB=L(fer`y9;%Y3YW34L&(hTG{6`_6>b_&VOFHRDGmgOYswR7^&ANU+FMr zE1y91^GcTtJk`gq-9nkuTJTuROz}CL&hugRXzSWkC~pyH8P3^mG*MBP=jDXRPV8`N zUsVj!ioTy8iU!+2qk23c{4gChLn%Gg7I9RBw)Fe?xKX9=bRa3+{TBFmtB!FVZ9RV? zG#`H=wKo-a6b&1te<9Pg9mR&+BimrsK``HR4To8BCzsKtj)f@YnWQy~^f%9tWz5aYA0qkCklDY%h zr2uXqRmdx@jn~snNk3k)GbR0|OcUHJ^Ck#$j*|c|z_gH$Yl@Wh1Ja=iSfK)kDe;Fu z7!v=0w5?(hJU>tkUd{60U`9wAFyr)DhexW>8)NiFk={K;p>BsZZ!)bPqfd=7NnLrm zaL%K{6ZIVXpc#|&=H?AzzMbnv5l{+YS_>`eP4`dI@9u$1Z0I_cB82k19N|C*LgaE( z^7&6DXRyY2U`&<&bxaRT(tF(fN#!wR-Y!clA|SUlyX&YlVrF+)tmpuDee!i9G0bGm z(y9qKlY`VgI6+^a_@|L)qTV+l0gFomZys!IIPB`GJo=YcPlM{l!0CE@@_F?s_RS>^ zP1f7l@trzF->aB$YvIkFp?9?_EAwaw0j+GNcS&#Ax_AcgA=V2pp)dw^b19RrTqu*tYG>bVTdNQwr%8`z5^0YhGB<3*mazJ@F(RitK zfI1}bVW4Kn*honiPCF47wT+ zZ9t`pxy*lrIo*LOKAodC;oP_tL%+=d3wOX=2($*%|IF1J*k2%fh>=tuKwsZsQ%ABw z3KmFxM}+ByAO)}M!p%d>BkcT&BIZFxXFV;m)AM9x6z~{iD`?#i8ZuAsiyicfd3u}b za%n|Ezt!Om!}5ZVlC>*Yofp?bDW^zpnCU+T)pALfZG?3Uz7YnMf_@mVaOge#vj}VW z1@ac@*{)yfnJb5BG}VvZONc>(5LS?OncR{%?C1_^5cy>!S3rVWuEyIF?1 zKhIQ>!Qez-#i)HW#hHr4K%BC<=7l7lFhmrXw#pF^kwah4*S|=C0Fag7Od_H@ZOMvv z_4^dCB@V5S!!5Uh79Y#4p!3IaD;V@K6vN)9tsm=ccqg#0)YB8>DwA&-+O>_W7c`V| zSL$iiD~~iE?xeD=P4&b=w1zRRRvRm~1*l%!DX1pjb~9UFVXzf>Z;Ad`sGo}8t%6Rr z7sQ4@cw>iI;!`ERzNc$S2F#_&P`lm6cuyN4w}h}bq@W&)^pBL%>2!0E-k^zZ#!*QW zXi?9jF`3T*u_h1G{2U4*Tnl~vS%3i|h788@$qwB7BI>tT&*zG9R<2m_^2Pc}duG`* ztGwbLZ3R4s0DtJrpa}1D`u7q&yMFQXiYa94N;wm%L#pC{)1i5%(dSF_Gtemdc&Yx6 zxZP0ZMtzFS>?l=RrWYth$LRHC`k;i;&yHBMq}j~k?ey0&{T`)kBDG(x4@&f3s~lhY z=aG_)%dy7OJr@s~3^xEN55WOjSCClGYMwGmF4h;M`R5`h01OZ(eN??`49h`5HSYd$y%{TgGrm|) z^Ka<2n2S_M%eLz^vBXDQ?3+s7-|vf#;=@oT*c$4P8K3K&OiT~qEbJCxpetbdCqCD! z=Q9k-nUq z%EDD8AY4_PKs1#zxOl;%%78SM>h931-^cr~G@SA``!J;3yy_hoFb@bJbrRcPbFdsg z*e^tes%vS|4&9Z0axUANVk$>s4s6X##moI@*(&`D`!0HEwXWN}ba1u)Djvn@wMOr( z9LS@`*64TBku`d(;@wK;*I)xE-Au71_?G!7uS9n##ha+7^lzkL{Dnx+%U}NnD&}wL zdMYge@3UwvU0}bjgyPn6x;500zojeae*QwnHk7}YmeZuQNbgxn%h~V$kao-OB04X> z3n}&!gqJO#JpTIMr5^k(Euv@mdtx3<`~>;W&ZTAi1u*WE>1NSc`8`3=>p1;EYQW#( z1Jq4^_tFslLNqX*zn-16l)ru-?Udh*be6xR8z}lyl@YeWPVGClDPnQ%~ds?ywVvVw^bZ`$8m0^9TPpSTivSv9|`x;`HL)7+b{e)7yk!tSM?~mUV*eohy z$7GtdSI?wb-{_xIFFW{c07d?C)`puami{>KBVb_YKD`dr@P zE_<5}f2+Hj9m!)QOV(os-F7&SwUjN-p*%j1S)PM=CSf9z{g6jZzXKBSAE(#8)2k_E z-_VTj^jr+hX5;bLh|d%mhr6>|ZD-7;Bo+PU$(0I22VWbC+MB?{tcW{i5&Zc6BdMI`xO%G;Vr!WooMaHT?v&b_%Wb&+^`YLw&*;e!$j5 z*qXq`DjB!hpWk6})&8XR$g7{)hZEUNy-6G(u;VJ`jvM=@o{!ev|EK7y*GW5NL5P5PG2k@1!URnVvSNd zm5!u|G-c77^hcV&7JY$gH4qJ$1aK>&K=E#(35rNjioc-u711rUcsy#L0ma#gB~cCm z#&cOQWrm3MO4&T>A0qBiyc6iX5V2P&oj|XIiV4-rCYVja#TBNAa1Y3H!_g@Qr!j4& zx1>gx=-^Pw-lT#^@o38Hvo}g$ftsO@mus#l(;YMh)L>)+HB!`0H8fl zVn|pcoPcs|)aHW*^;H!bK_(K=K6R*v;!0AY#fSDN-||E3bY&12m?mDV zYD(OVMG`eg7nwXSUDCxfsJ3KXy2w#b&EZUOZ@M)qK=I$N=Nh_8go$l5mkS%3s+#7dqT-S?iAtnJ0C?4 z1MDugSc!APRQcv6-kAq)1be1xp**`b>MGuOQ?JmZrlNKPze2C%yFzKe!}sDnk8Y~7 zKDN!UTw8<|hC{L)TG?zbCrn)l2}5A_1x3S7brvPuCGK%9WMjSx+rYX&{qGV*S%Don z6c!593#{VFtVQmMJijz-R5fbCI%w!9-n5pEERGxM@NW8qdVUy}QgWy<784#d5%<_n zP-D?8i7vd;JqeWN@ViAW^C-0XovVSj3Zx=AvV3|}o6rLrdMCz#D6gzh|9A&iDCQTO zpaJfFsjRBWD&jPtndoqbe<1^(#HOAwM!&U9S%l{U3n&%MS43Ym6F5VCKhS=AyRZT|`Hk zi+a^P@1id3sHQTD;xq3n$yHEXM0d0huhw9SUBk5-Y&K{lo%8dHNd*iaBStc|FbQaTd_JJDf45bo&$iOJJH4bwygg=T&%I@aX% zV%;)yx0druBPVxHq~b1*hSSGwM02HV2K~}TG-Z19nS7Ds@V;dY$BKN^Q#y*i$QO-b%H9eLsfLrt zruJw@h9;sM{?Tjbi2@`1Cy`fc$1EsV`}xNOSj17` z*DNqhd4OT77V<2_xReZYsEay@5ND;^DUWyHw-I<9(Vl0YjKHf&+3hgT=-}(^tLorg z!7kOl$LvyvdqfN6)JQ74hbI8~%lC-t*}gX`4y>=zz!r_N2KMYdSo_`)lyR?UUb|>S za43rvUbsKYMFvL8>*W!Dt)^G*71`CjZ&WCr36{$sSmdnjnDDVVYrF3ijT}YDVDBL6 zK|yOZ<#iAlslFRnXOfPT#-!MY8|K>g2My>TUUn2A*`W?-6#|?cv3Yy`q=p?uio^fs zYPzqZ$W}b#sGy^0K-F3!77Czy28itF1yS}Gi@h90n>%(+0b(mY-X)#<)rW*qqkDUX z)46UU5)+qyZ_gxhcE^4;1V)&^m%>c~$e18s3IPM0$=HFE-(BQZlZFErH-Ptrt4C1f z(xTKe^hS5lpyB4C2;9D5mPe+X=|${^v?|^Su_3Sy7~Mrt7(!gYvEg}oI?`R#w4WhI z5AkHf-tK4wdiiNheA%V;O~BYYWQx`iqbvyHn;QftyJO~t5`Wtn)4=AqeH`?4=q|=fC z0Jh@uW(n6G7WHd+&jm}EDOZcRCBYC@c|`GP%6v%FqWmr*JjQ#WJi{^&3MkNbftKI^ zLJPZyW)AOZxl)qoVi!?Y@gi$iQ8T0LbTF5f7csU|v!%W>)Tb-A@Qm5QIbB5)#rrdr zb`^E)9&$b?T1F9WEbtEMJ0W|O;s2?;Fh;dDEyYaWIZ2)eMXJ4sW+7ivkss+Q?k3JX z3TaREN~hl*5m|{4e`AuR0VF;bYVYC!gPMG04lHE8LhqGsI3J5#kS$5UAmAudCmK}R1IH6&#vD~ReP zvZ}4O+W_7m0+`gZ<(w29}-O*W#3zKb>SgVKc?v0U~2zfs{OFYjqx1_1_cW6fIr5QjRI=N9I;-uY2qtirz*n4L6gMI(~3L(f$Lz-({>wO?0}s* zrmKjl<^M9+uK(DF$|HTO7aE8@gg+)+4&VM2w4p5u1!&i%T@MMT!@tAo(fG$ioeaCbQ5jmaHO;MWzbqjt^0z4 zDq2Uw`{I1;`IJif3Kyjf68`iW^w zj{oa%k(L@D$C((%`G)U4Nm`tiJ}zpi#miA1Rxy_j8euv45vrV8L19mTGW9Q{E>DQp z|4(Fgo&F*}!@C&8V;FM6P&sf1&OJE}i!Ohozv#l};ywMvT}*6;4G?!`_!pM9M=?nY z2$<1f&wT1XSfn%AG~y}I+QjAlBF5z%vx??b%*Eqr(>@Q-Jw+m?GY}gl#saM@n)uVyqReoZ)RG@o0-<}W+oqRo>ROtY05y+ zp8gsr8Y@N9sL@j(d`oG-Ad%|uys?G`493|gFtpbO3)VkqIz+T-gUvwlYMHD8rGpIs zj6LY9#Q~OCV=q+wrlEDFm4{9?G|XyZh}hqd<`;ITPWk5sgwpz_MEk}?Q_VrfnDo34 zm=oIz!~k9dBIF4cKH)no7*ph>hEHSZ`@K}~G-eR$>kI;pvMF)~`zoG^=2o6NNZgrO zJjoo#3Ph;|Ik)z2?;tF0$d987M4ojlN)7I^;O0GEU>=WNDiB^r>9_#;9V}{Rl#cnE zO2F8=9Xw0lG}~7?MC4@n-mp3kSgwrcMw0)ZA~nYMW-vk7COYtpsHKcTM{#s&It)q; z6_LyA&z!LRwK=?^@E4;Fdw!rfEdxZfxx$$wzBhPrJ~E!cK>ck)%77@3{Zpje-V$7V z^q5VN$WJM|MgyM#rFmOX-vyBIwZAP&@%>4|hJzYoG|HrZ%b_5EN`I&R_{OZg1m2}N zg}${^dl=4qr7wY|`IQb0#rEg>jUtEPyyW?v6V9byH-9q(n9{NQ<7P3OaZh5lh30RybFQ@e*~CF%byoD zvQR=@o2|KxnO*OG=B#7G4HKvr@@?&CJWz7sc^qCJCHD)U5g(q z=Np&e77PddS$vLm4;R&xnZ?|T#!BfKN_$ou3iX~rcd2bFQH|8+0PMv-Q{Cr8-OSP{ z072MH!k95RtN@8xr}(1NTtclTrFK|jK{S&*KixX^Pv1WDxM4Tx1?In;qGc}teHTN{ z!;}Ba%V<3A3Eiis&_^$eYK22^@QQQ;Bk)lUx>X=I8RuXpH`!T`Vnu@;qU38H%gVD& z9gRa1i@%^)W6M!;Z8d?E;MYc)DdfJPs@H4sz5ZaPFJKJ`$eP6-P$+69Ap{KdH7|mx zT1-7&64fdFMNkXAsEM9*7%Zw>OjDWc&1>P?Xm!(fdCWdYxBZ;GZVmPt7<%A=MbV39jRIqP6)Y-#K1wt#{PDC?i&Wo%rWbgQ+NfEv0Ut|e6>a<(SQC)Z z4&GuEZ3A#zybMrSN~>twbF>8b%`+`*IU+ue{n($-wg}88>$XT47q?Y%713^ct}PNk zK@DCIS;n>wd^gC7axoYE~RCdejYeExj(!j($Y%zRXH=>y>e!hvad_p z{f`K9(z&-lUtAwAS~v$WE{nkV3P4!1U)X`Pv6U^u zsrq5d!xfH3r)vjpfS(N3ton>J1cf~qudFe{LD5eA73YE?4Io)|h-U)p02U#f?(izC zJp|Sb+lxq|rzVPjK=*IML~(b_-gD7fG}hT$4m6g!Pr}K%QVE>Lt2wlE`hi z9a+$PGm9B7gVals1%u>=r$PCHDTSIa1VLYUMYmd+1*)kK2vtT9$}(F(ArLwwrhh%9 zc*Xb{|4qW}Uh#0ngb`X942;VXCC%b6{p;zkl^xPbYL6BtShN*AR`gQ5`)J@;QIO;1 z3B}?D+OTV{aT~yxSB8T|wZDjWvv8~{`E{%aQxsTRd3dsTRPpR9SvDDK9tA1Wup!-0 z=)&+Pd20x~G*k^!%#RGkOD?<#iOhw6vxdn#d}$V_4*zCa@nw@_T0cufhZb$Yl~K}~ z4N0LBvqU2-AZ<&6D}q^%nD}1QctJ!W^_(qYN^+-(;t*OvK%g(p7B5onJkdIwK}@?e zo`%ko;5Bca=n-#{Z6*qZ3e}K^w)qXq z4B*@ZJggu;GvIMC-V1o@z_T>qX{xP-(^Oh5h6`o_0q`8nhgIwdc>2aFzCS#r0Z%XO z5U0V8T4>Yu!D(jXcrC)rxD#$Hk!H%n$hZw2*~o72tPgnZl}#u*asrqyiG!)o(J?eHo11 z0un7n+A4CMwU=C&E!u{VzCa|=wRc5M)YcGtDD!oFcA9^=Qx+Br)Y;{(W4%9yRnh{R zdnHZB*cS)6@8Z2jJ)R8I0Bu@sD8wC}Sa@4Nl~MgJ73*WH%hX(k)txBy+YBwRwE7!E zLa6>CaR>CfA6O)^3h`nRv}z8#CApgM3iz+EXvhGGnUhe;-wM%ybDMfDRvYDj9pV2i zAxoezWq2^MQt_N0L>+H${H|J3Rh5ylSlrtY!)zvXIMp|Cpp>Ku53Ln!=ffq7B>q%o z*Ll{g3E&9WsRbp|k=$cME|o42X(br?;||)jLfnP1K7W3224#ILtg!~M6fF%N@l6fp zi{qw7w~xg?tSyO|SZ)ori#aj}pmke}py4chiWTn#PXRe`f8bY zQUQy;;c}pUd`B;bq6og1mWxr!iClX1Bk>mdLyN_I{OwsR2B2`1Ck-6R2Tm2{|C^k2 z`{3Bj(5YI>6#BVX#3Yx!ErS7e83o#A+kG%Vh`J+Jh*#~iY19gFZ^-Oy=eP8)m7*_{ z9}cV(U7`XvBVM;t{Z*n99@cnnm1vx9TKL4o)=`S=>hUbTyd}xozNCICvNBQ;W}3SM z86Bck3$#c@Ij?>yYS=%f^wnY{EV<2FE!+vd8wuLaza=nbhvhyzL)}1oSBtI{Yp=Bi zoVjh(eGRa_pWa?0YP)+wJ5QZr&%xeOWLE$rpn8}jS!CB>b(^dDagE4LxSEUkMQ{;t znQU%va+ip@g+Jw4)5r>IK-kfkNbSXdr~bUWba`XMnlY$ZB>|0C zCL z$k#1_RxNN~fw=VaA^$p&XP-51~>qV`K5It$Vm~4NA+#5uzw72ujK4Z*MD^*X= zZIEz}HCc;%8!(bb=)wlku3|yWH;Q|su_6O&@HD-(QM{*MJaadR>h=`sx=CcP_o+=H z$KIC4ZW8w)bl)bZcJ!gkn?(KUU&c0fbdHXd2b)G{gW88FX1Fk&eW6@LEi*#=^>?^mL8`2N?^FjY^}lCMM$`*OPWl^7p;3Q&%I!VoxippU8X zXJTGFH~v6An;yn;S(}drANx$ygZ^stcF~WEEZ8nq*pE}@=OWvFh3@_w3}=K6_*}e~ zb`JL|8Q5e_wsy#_efiMP$=-p%l9^J&H9RlC@Y#Qd=+9X)m-^zs+788g2S^^&nBWqoG-bsa9$bB@0K0$POcP~MlKuW~Mr#(xQZHEP@P zrFfOU?Y;ubpxrkj-DRp7VO=8|G%J}}VGMy=A<(R}L$mUgZ$$lwKJw5EdxT5B5gAE8 zE6l)Pvdb#o|03N7IFQuXBl6?F#;qL~JLREjVV3&*9`KEi)ABtc1M~Xj z9!yvfo!bL2`;=;wim}|l<)z~3j_0GBJ9_bx#Oa=6x^H9+F%@#!jG3U+2rZ3KHP8N8leoMI?^#CdUddXtE28F1art^&GxC z%m|FhMv1Su6h&P{H_l?OUq|o!EFPnI=R~yx$?Lc*FAYiq*v_};;5T9&!^~WowNJFg zJRH~uY;%P!?=y!bZNJElotw=w%BK|2{#&Wzek{zDG* z69Z!~>Tomgy%%7oeT!M0OX6GcPA*Sl=ioF3Qr*qd*ho%eXKNbks2B4n?>muFofjA{ z!p@k?x{l7c{|!BMMjozk=jPx{`o07I&78@*9GS3Y``^yxQwPLrRm>%7Py0sH3g6*? zonHHEl)t4%5TF0W|F$=!5PH0>rQ7bEDBv=+ZJNW_6zpiwC@Ko*JaKL&VuEW zGSiMj8_&urJEmpILFjJcj?+O=4O1R^2>M-Lt+X5BI>aCOJe7>EQ;g2 zGkH5nJtEp8Q=cQEtNlEEa0FZpge%nMsOXR#n9Q}j zH0wIn+U0c0(+H+>2^Ad`E9z{;^>%7RoQ~4xfvtTg_2kNVxFCA zPWut)wigZmQFKf#NRCqwOj)Xb(66V& z^I;fbh)ZeSQ|*(@f3-~L)?`d8{mN3 z2U1Uq0feHM5x%p<7Al*N5PDCeE?(JlU;-Dix55ddG*F^j+BmBTW9?b+c z{pFgd9>*&SM59HrZKsq!#lslbA%9BDx9U&v0$n`^z}QPY&*RW_ERnihgjT_?=f%)| z$6#3aZtg2KC1aG&ix9JL+II;=;x@W`2|UC< z^QhME!o}atzl%)9tyUJ8u7+XZI!ga$N@xCd#!K*?-^C#;?|zr9RdHFg<0gH6S+wG> zazzZ|?{ing+NA4z6yqjf9PSMq-r8OT=AS|Xu443&@bp!&536+JA7TT0U%e*M@0@72 z4g;BNbT|%Mn6|@waZc`fS}8m{%3!_)T;#8HPi`G~*@Ryqk?GAOJ1gV_xb@KxKr60` z#5j~3D3|Y^%M13YeorhYbuJeG3YK#q1@+%$WVFRgo!&Uy-nW5c4R}5HEhi4vpnW?c z4G$u!hp<+(kEe1RH`Of2>HLd&{Uw@$lQQ8iQ6JphPyT`;8k9(5ZU8oi&_8bA0NtBj zxgpr7jqiqNXCFA@rfB=nca!3PIYED@zhuXR0Oe{QyvsYq3hX$h(BtyT#BxI*5M_ak zK#nl=4?A-{1Ic7)wv`xfAySEH?V zBMmpdiUxN}i?OIHMXOVw?k9(03=F?AhxrIk(lEtn5xE7AJ2>P)ZiQmh4BL{(n&z~* z!z0O5rWm0ic-~W?VhFcT`0xo&)uw!hAyt37JB-}U=F{5HZL>_0Xu#KCcmaigP-}pZ zlcz+xcI9v?s^rJCIigOE!;DY@5wzK1q}JJz$cx3~gCZ$wZvynKL#viC*tE58L28=| zpR3w?tx_?%um;e2w%Gq&eAgMNYpZR^5Ldl7(VgzjJ zoQ5>Kf2TA$XEvf*s8JIj-#XMt597f@5Br1~Y1uDGby~Is(F^n~xFkJ++BHS{^em6& zlQcEd7@4{IMgr(6^X*WVX|w^AyFe48m^;IaT!^Ozgc-G+znQrJt1r;hFr)wDllL;Y zZM{0m<$iQ7Rr>{Rkm019!4*^(HNIrw#62m`S8vGmJS`NmH78`mC%{<((4$7@K}K6L z02V{0P~UK)UEzta#f&bD(DXjt1ki)D~@pnh07C>u|&Mj6=&8+o$=8ytmQF(pFO(`lp>9=i0dB^A0J zbX^L%&IVm4g053=nY)`m7{;YY$(F{Y$RF;$$K$ifSGN~Hk<>ghpkSrD?&P< zXGmS0MrNV)6g6gvpMFOzXs>*0T5h=fbhIhK;@7R)v&}8FIW)~tPl$RW1p0?a7Qti# zhk$LtFB34;$YVGXBV=Y?9}s%s@nFoSoR#r1wveTC(}D@-1YHZ^GW)zVn0X;wW`RW< zCZ}*cgjr^~RdAWH#T>@Z9cX8Ru_uDDeh!mO@QwYj(8}_@OvsaUNmj?MT|rl|bfG|X zZbR)DnV>x%6q1k;BGtu8kfCXB@k(ax+-U zs%@CS(VTFEH{dFp$S#guD`VL;jpedl6u=&@^x%g**V*GkeNuFYl$;0i$8q?W(?@!Y zkzF_*QKkm}Xm-hk;$@c{rkS!JoAw9Px#eTFe*lbrYmJ+u+BS~Dtp_t=ZLocd%3WNm zZ1c>ZYiBTa8(i&e5(s=8DC;{EjNT`s8AM7sOg8;&F!n?+)*p=ZxYT~`5c!C^#39-= zXz*Z}%F$t`99(|!UG@#Iinc-WI|m`=3~iLnYz_RmUb=V+isW2z8FPZ2@ba`w!w(0K z#<#u757Ti7#=|2ob}Z%8Bk_Z!3HCLoEao7dn)0Akg&gLolz>6loR~Ew`Uv@jt;?2DL0X0c*eVp zYNRK7rkaoC+DPaz%|VExw>yOUoJ@z~ zjmXe`Ie7er)+0(*it8l7M?R(5B|B&?Cim+iIdzb&RG5{!BYyIEqcUHwhooM8J& zHaUI~0n|^QBp5a0d=lkrejDE@+A*5WCK%7B&IityqA(Ef&>fJrA5>4S(`?LyL?hZU z@+R7tXmp95^l?14PN9p5#*jj}cSs03a42A#ijN3m z8*3g6Gai$adpXlX3?WSD%hOnpK;jNbR2!tInnEDVi*4(IWIkB|rTqRFj-=*WMktL> zU?5N&+Eqq6Jddt8{$%1AVqk^{eDL^bw8q;#*QvWUXTqr1DurbwvQ9!j|4CE+MFP$wyu|-rw zQdu>lL313PXQFyE(XD`u0!#aY7EiRXtiKa^tJQ7Fsdp_aA@ zxl))g;0LfEnPdL0-Gy31*hm|u4gx!F2rlK~NNP1so)`l8kU<{hQ3hIK^;O=^WHkbl z+Y7T*OoA$s+QO@(HoWBwa_eS_(J+B$hE?2c(zcxDM=SGFjcRv}n3n~GzcJEa9ESpF zg9Nq(Ai@Hg$w-yPsqpH@cp8&xtc?y(bTXuSno%Q7Qgpm0EBUTC;B%=)%9JOKNi#Y} zt&T{S!R}~!Ez@WbRm0|vLCR=oN>oob9*OKH%{H(Q@zr#rc1o`t90RyCOi5Wvx+@-s zL4I#)UAoaF{Oe_L@C+wshVc((pJW*Az$}=bVcY{fuZu&v@U_vXOrvuO@4y(izry5e zbkOL;=CcnFJSfw6Fa|m=5l(kB0Q3NYc4QhooCpfTxHE<$cXgwE)XleJp&)ra$(_or zZW+#Jt?#p)(nBY!8xK8F7K4d3MIqRJW`ZKeC~mtCv+YfHzoV%Yo%mMw)9U(xfaSHEQYg#i4xYm@|o1WEp93OhOR6Gc5@J$uLU#k-TF8)3JdN;52!?W- z1M8teu*+E+!Q~f*uHu|2JAg^xqY>PAHwq*=KbKY^UxQoxnN<}JYBaT~a2QRfI#{hb zIQo{#npT}G;@04{+;|)!oXz-X9nESX5Nlx!c){YHi*zxs*XkH6rPg88k63^VZLVYF zgUg}RHR^%EkXzRn7`Fu(hG6k}3AX&K@$ zg4zl5@#{KDG4x{S=emYFK~lk$!_(^-Jt5K_T+e9lUWJE(8N`?ujaFfW;ZW_h6ee-s zSD^XB=BQTWkZBP}ynghaAT+VYL#T%a59 zLz420+!iBuO)}5f-0#EIo+T)K2^ZFSkD!xGws-EM((0!4UNa*p@xmF<7NAZjxpeK zBDkob(J-Hjwh7_>8wy#U$`zT%b69K8B8siS*8l@jSRRA zb*E9g@_KmZPNQXYXt0AuiFUKb4NS(`T&k9fCbIG%cB9|!G-@Vs5+|b{Hmj3t=d5*NlqK5p$0XLtOqS#ljc8@i89{<=8#0H^IL~Kgf&WCxH$=$ z6`YQF^4(Y9OUW3*pyk+s6^i~!0`&p{G)!`3fo^C{O~X})8Rn}4Hf_nKWXysC&u(Ll z%Y@qWEeHzwK*XYED-Pf$P1VY56_Q&{nbxc=K%vW4j9zSanMs`5<~7OM`N9QJW?jsX zLR%$w4JQ-}8$yu8x@BzQ+opXnGXXKcK|f2wJr3YfHzYlB_d}@;GXcLxul;r;(W(bc z?t^y|%^jWz93G6H(O0t>J+&JL14%)>o4bunQ~YfpjW!K!!+8I4G8wZ9bc1tCg@jwD z2NH5U6jjT}$p1ZzmqSDj23BgUO6Kchic;u!P00_mCU|8h)1??TMN)7<36<;MBg8s=c5l&1C9PM>=FgIY_mE z4%9Ll76u|VILy^(XME)J1v4OAjxNSit_yABd#ufi8wBMgIzLr{KnI%;GD;i!T|~fE zJEKnEZ&rH*nZ=eD0N%K!@q30=XxCVS56uFoGU>|jDfzd78Ro;6HNzq141?b1&5~^h zG6>jshPja_r+39>@lw%`>HSn<{| zQd{C85Kkm1KU`eICn5)mP)^k5Ot%F%*XlIvYkU|T)7YtQP}7}XIqYGyx#o~W`uD#E zsUQ$o02YqxBsn(N#$GbaU~4YhhZzmpnIapE+B7KP0$$hwtlmb2p^b1<490>4>G4MZ zCIFN)*akgTGNU7S)To0+l z+aB+mnAWb{4o5y90HC4bSy@Gr6t*roAsJX0As9~{D8wp^{DGG7sIy#&c03yuJkZz0 zi9UFmXBYtZ1P}8({%2mYr$eRFokYi*8nsekO-*80*!+&PoPJoHh$8o0Mw6I17DpVc zwJVEhz~e^alsNz|lLN}NedO<8-Y`#1ieic@`3{-BGOQkEdv03;dg-F1beI!^JVg#B%k0cAaHm4VQZ~Go=h2r z^F5!t=P(lyRzK~~VeH<*=-VDtIAC@s0Ep!s=1>7mq1^W;Cf!mlpY3MK0(cdJ&+M_Q z7ZT~07RHi7F4#PMX(K-_3e~dILs>|L{n&#I*#sAlOI^+P-ndC}r5ylw4Zw!$usn|Y zOrN9@G(US}@FD2}g`)N|-@(Oe5D4NelJoP|UQozlxU=wTSLG5s0jC9U9LTNU>EtgM zTH1Bya?4q{%B~%Ea{ZUsc}iw4W2bbTg3Byuq-2e9!V|$*Kc<6OA115+kmZw%ZoW0b zQ4%mtSRO1KZ9Hy3u_YYslojY=&sobO+2CcCM>3T!Ssp36x@vi(0HoCNfaK!)O_mR5 zCUns9u+)NE(Z~(n4o{uz6!Viz!5bg=wa;Yti;+d!E}g5`DO1kj_z6-9vJm%=%)o67 zwG(CF%$o?rK%)L>?DTJ%Cwb;`*yH=z6lLC6muVh#$8!r>a{ERHTfjmLtpT3~Wrf=U zUQV^6qK8@SG9hF;P^}@RWQB&E4K*Cc&mp|w_5OneFFhJ#aDM>iQ zf+2HaSTH8RXE%3ULMSuh%~)o`x4(&haV#~Fm-epQl;vnD} zDIb{3i2+7%2AR3hZ4K9hF)pXt%jL9qYFsY>+B&ei;tC`%qa0MEXf2pr)5?y%V-4U{ zcFEzr4i=HN5MK4KY`K;R{;M_xda)g2 z%DpJOZN6`<<0daYuH@kPBn`m!pGV3{Uwko9-TwH>@s z2aq(^9Rl`8A+)pkC}6`1mOR>>6;sK2C6lCbqSA_qWSzGsLTe-`Fn83g7y#{?cDK3% zC}aZm6)e9c)_$;v(FZnK$lxG1@v(0@qi9!(`c0H}DCmbg6nD-MbhSLlZw0LnN_d#NkR^7EYQl^5W<3Owyd%xy7=b2){xrx)=>&4t|w{g~!;=rVfw=#H^J; z*g(pI_93&mdIG89ckbehH&7nKR-nANE#EV)n0wI-v`XB2H4*5zQi&%gGXk#|6#w&x zBrQyvehqKpR46gw+O|X>lL@=QjWdHoXk&MyUaUN=07!A<>1GsCHBf<1|U#NT#*Go zljre%!rNjXC~@r$boXAH{8xN8!aoR=Adq+&4T!my8*uaH1u(4w5$>I6LX4FIiijM+ zM>!=Qb`B&Xh>H6dxgj1G2&(nnjfSySFsP`8;8xK5!A5SF_WdXv{HQ?>qm{#Jchj-H zM*VOl-{sW4UQKWJFk05Iaxo{?&d9;#ism8u<45M<;n6Q}k7&icM!iVnVq+gagpz-- zkrxKoRF6i|vB5?I74}QPDv3fH{a_rpqGns88k?E=7q6G9`b1OK%+4jE^bC34dSM40Vp$v##%e=9)Jv323l|; zmsAK>*P!qQjJT&_KIDvOrzGX-=SKa{ahfD0UCRbZ}EKy4d z<}3R)88@N>ac^u-)-vVhiaFQTNS_61+UeHYIMNrWapD->uge17tw)lz^dMYnOO7Wa z7HWJI;Ag1sDxe`)^{hq7lG-$zJQBX7V3T+J&IkdtJEmiR_S4p6_yV0HETd!~Ei-N- zhQXveIpyTtNhqZv92Y`-t%22o^SR#*&JEZ(nB!*3A-BfL;z;X98<{h5z+&)%Hz=b_ z0iR9r7zp277sKI~%v8C`6;ULf}wY zVPH5gmsY>sxMB+#K_|Df!tlt7GoT(~3Bpk=vvRPqdDd}JH@Ld%D0o7|?|{{3kDXg; z({9{=h2YQ}HkSmF98k)C{Dvgos{+wuN~jsPSS4u-7jOj7%d_dOs5;6pi9QawVOJ#A z9VtV=&cpz*6X2#6m<+!IAE0MkqD+|+35A!Dv5%$O6pa6+YSKk(f5-N(IiK zC;}&zXcrB7#K>$}ZmcZ|cG{XL9yjFufc2{`bM36z=EQ9%P=6SMF-kfBLH0DqM#l%cpH8)H%99LZ|@5Xzn+DtSA123<69^;cZxOTiU_AW5_aR6Y-e$+^I zV9KfaqehcLjt0~*wDI*rD5c2aqvaBaa{v(Cm^BPO#I4Ni#^M1G@j&1M@pUBFeTd_Q z0b!vnBS%H&6E#~mX)7;EJK!#G<5@$%6tIR%RZph4V_6*txneO9g@J1gP$I)}bL5-X zJ$Uu=p5}^Gx2ZYtNC>yn6~j;AU}f?E;9&MVM)?NzM~Ad~#_f4FCx$f)=c1i*5}}O` ze}OB$pr3g2EBYhEzH5Xfc6z%3yJJ%~HA5&b(CN1p*P66oIT=8b@5JRE30t?&NoGi+4<`iN*W2juJ z3(sZS2V-nZwgz@EW^Bas^kN8ker+0(kS^NZQ%V^Dr&dvzPa6tzYMb860@7X?5r_zN0aTPa zg*fC_4CZu9g35zwhK!O-%6aCkJBW#Xtp{bRC~VGP zS3^zJ9Vbc3$l}@a&|7s}nDjO*TMkw`dog|1R%rQi zkf1J%M1vL;L1`r5IrNt;=;pm;&FX0Br}z69%@h8bj`NUuOp&j{f`o5nlhk41jq{0; z>M3W5AZv3zuwOlxcnco_F)cV|^XIp6;Skf3W2BN0hQ2~+?^@iqt@cS!10nKqi@`Wej&S^Jh3H``6ZyET$|jV(+o z2GnTZ@C@-1{kv4FIMu%Yl2uXp2s>_k^2=wZCr+QG zGLv~Jhm6=hZQYEEXHE{~kcAu~b;{Xgp5oPwAu?Rs_$Ll+LEq<_Qee^E!1wR-&TpGqq4(uIFcWNhWe3604N$n@;A)VQ z!r-YXJ-qp`K7h@onmQ0rCkIk=MHc|~0Sa1QLWz^jet*!T*u(Htw|xWNu496*jo@HP|4twob-qV2IjicAd@%0j{EC~)I8 zG$Q%#c7RlnalG-nd8^};(tsM_Etly7NzmAbW9Six35u4z;lbzZC=g>W*E+@& zv?)d#fZioQhvnK_R!(v8&g!(>c7sGsc~fhjxWXi;(6qo_-NVJC)^oNQ-{r|6n}d+sZKV zvThA^K&#dYQ^$k#0A5B68nc&hcM3)&VT|`EI1^F90JDaO1HjZ+HruG)K;t=OVw4M#80I8Xlc$W1h0N`g6AUCPrMUdV0nBT#KQC{#6#=bbcKFOFG2D{b z;Try{y@R-G;rFo`{#OW*WrZLCdVwlT!F7Ob%WPw2-)@@}V>&Eeu^~jkH3R$#VGiJEiI%FQ;c^3Y>M!C_o-&Q;T?3zQ4f@Mo&O;*}1jA z4e;4o+f^)nJg$M~%CKaM0Ure@)#@Nps94I}coby=l?@QiQIN?+KRs>44dz1CBU0f& z76UuajI?>(n8y@WoC1j*H(V<^w9+zMZ|8HY7V=_+Aa17=&`DgP@ipL``oLo1vnCUeq_LB?IJV;zhxu)y#XwQ26z z=8iHK8ef|}pkM)8Ya1jZOhmIfemsW29YxO+fWU>31)B@k#etEedJgldcr`<1p9dw% zL||CCc*FSSO@0;0<56%GGsFek7a_oSJ{xPQN3$1z1cnOdfFcH(Y!(=876>X91@hhj ze2Ik!{N&V9p=;J*gvS&b6+gPhuF zUmV73?Z?z`h|yXxledl7w;pPfh^G}pjO0kD(n-Df5a#ITI@B3i%t@?Y_)Tu$5prlA z9n8fB`2V!Q+XE^hsFiBFuiK3!5j!4#NYNlIqF2o4F12P}uC`@bqvBc+8hgGz*| zQ+i6?n`yLlfRTWZW;vaW8Wlkzg5yZI17RL``#==rI1)7;HR?IHXDXJUB^#Y!DVYec zC5mlnV%jJuixe!g<>!M(@Od;^d6c%7I})JKe`l*f!o5pnE+=6*{f ztx?ZJ+5}&My63jBCz0(0&w>R9!^BI0cV@vTv=!`OH4qpWa566VBm2YUsbXcg*5e3O zay`C7pn~lpclnYECC~eZHyZUHZrlPxxx(S_gX<4mX~u@P>*#4ewB$1ATIQbw(!M zp1{yBpc@R!wGbmQJ783c{eevf(hP|j&QC7S!DKUhRjGj;YA3f#DGx(7-c@02SEQ5> z&@%+gs^iDBsR)be_)7?S>^;;mI?J+kJD92^v0-mM_Ejj1cQjv=zK?H~_D!K?gAER} z+;6aPH>R?7u<<&q{T_bY(9>;?e~z({=fk^LFuF$r94G8OTK~B5@GY?FhlT<3bOQ6U z*is!(jb=j2aB$)<=!Fvw{s=>3UTiSQhALPr2~3r4n_9(~ey z7!ClRKWWrLTh1XyeQg3Y9AZ?~=2Pz>hBu0v!HCfejT-|0p{{gdh*1rH+)o*Gb3k1} zn579Zg=n`o9^QKR=L$^e5pW17$WA>h%DtxnD2Z(Jh@ZUbdLkSVDDNqwnf4HU@|4ji zkHte47MZ58c!J&f1L z<=KK9uy8ynUO<d$V4zni`x)bQ_ivvgri59Ao_WTonTPN)rXf7I zVD2_ByeK9z2ll2xC5F8g+`7WO0nFlW%v;VwsmX4V(;fP+>RG|ADri+NwAG|pCaR$b&4 zv+c!&a-9`TK?vOD8nmcrBCuC?R79t1Hu7Yk=r#N02KX`8XjUb1-|vyYk}nDb zbnx>=m8Ly0T@Hi7P7*L0Rzd^&xP1y28usI4<^V2ao|#%!jPiNq>jIq9-Z=1Xo*uOS zd81eS4g?8d77phnX6pGZgWA4ew9-DNNiP^Z5;%4=Gg{sq(2L?yyUNqR{t9G7IGh1L-JSwKPh+pNZ)hJ}2YWv8{r`Ok9~1Z+>iLriZ=`sR?^L1N|0iC_Q5t zYNNDDOtKS{lMlj<(C1@Cc^Z*##CNx6X&S(noMd2%;J@~<77io~JSMN)OOa-d5^ptq z5xyduKbtSQxqqYc`9>W)e(Io{daVl%b1H=$mC+`BAg`YT^0O5NO#~6;j41RiQ zn33bcSZUQTaF0;-!l4+b#-tuT46J-t#_tN-)Kv+ZiSTJo)gG`*l>$cC-=eScEl?py z$%5f1V|owfi_uk$09|I^tyc8lNFyZ^=0BnOyZl}OsQ(Ax9(cF8$2(zq4{juzHgss^ z#p0>BN#DI>_~RzI5I2cDql_kHHX$Gtn5i2uIk6$x%#n>7X{1K5`6)`jLGO$-IPCAP zk;Xl4Gn2WwH>k!-Mw)ZZ=qW?TB~!1LjJg?XBOEqU#{rEtVZc0-2+u`ln)@I}cVg_? zvtvNT2*&L!_K3h+!6|BlqedGU&W*9OaJ12Z){QdScnX)#Q-UEYrkG`>zecOTQt+s# zNOz3km||R=9V!NnF=|!DRZ(s=}6867;2LgrQMCCyTo5vWLaBL2Gd#Vg* zAakPbC=>FY9hp>Ztm^A7{-a*YNO1uLY5G{BRryU;FfDukm&#$P&|&q)fp1biAmylN zIo@PyTdfUVu;EZ>X(}Am*P%GGK|lB~ba-|rtE&KdZ}PoW>F04k!6jhrG(LmftegSE z;rSSk1KF4&;I87C;llF6^+Cg>xuy?a2X-a|KQ0f$@R(3)o{7BW8MT57UfhUlLG?fe zmwx#N77>e=_K+(MaQ{BcJvyAdoK_xPNYPKWt9wsCEr={zMq)1$4#hC_cg|v2X{+Tf z%-f3@1v3V^&!K*q!JH6r2G7s(jU5$EFp|>NTTUq)b^==J^_P-7musZyYtZxV2{5jJ z*o5D9m-%0tx9_$v$7xGq8&TpDr>#%x;qeI#0YPc7`&npU}(=*)<;~l z{Y3bK?qK72_=5btkTOn|t6mPH!Ed|nar>wKja8s23gEY0;5+-L{tMbQyMfbsWqmvV zW$Li`gEf?IE(UtRZ#(-t`=@@|Do`1{;J01ioc&WDVfwdcv11+Hq1#qqRCaFtfX){n z(8L9h7VfA!i~mZas?4GNkH)j0kF|$t+Ik%xksSD!HMmXI(we2P>Q)9y@h_{?q)V?_ zkj}?1;P+6d)xJY3&B72j(gDgpf4tE$&yP;PZ)Y`UN_`j3daxZ>gDcQkvfOAA#?C-@ zlX60?W<>{P2J}X-F+LL%rGX=q`AcUXCS*kixiKLLGGZ3QA8-WAU0Oumi;UTpEYApN zV(%vPOCNzCYH9is|I#hOFH`I<^#3Y4j!HAmypJH~P~Gv&_H$05m4jHt4*fXiEV6P! zIOjXgS#sw6JXI}}v(9nWN~;jU>>@}L=d8DK!Z|0OS79sXI2~CLoHLqpimV(CjIE#J z9A(jdk)f@Ct>CVHtwf$zwY7wQ<*AMq@lQ2~LjI*jID>zw(NE%EYG&*Cm+E#a|5DxY z)`zsQoJkl=bVe)4F*)H4X##7GAAqmhyUj-XJQVcf{WV*To7usv1@jL2Cj2sYio+ca zV(mE>J-`zRdO%vwCMI^{d$e(=Iyt zaDvY63}(@*M>%DeoQA$0 zdCBPB?&6oNoU*$(1q)GEi@seF$3?9R%|UIfz{q{LS8nmwu>X@#x61*iq~4y|4&9La}MpoHI0dn_fh#f&L3F zuwA&_|3_naW7?29ffQ~?tX7VF2#1frt~~%Bj9CBRMuIND7}}my!NwHyZ`T~TiY;mF zfxr57q8{l7)vxfyEiW!E{tH!T1YOfxWmM7OjDW z`|uO~W`l7HKoiY0MJ>&UJ#3zF)$VcU3ih|MQ@@@|0yOM7ZC-``!~LK-xtKrNp!yYL zgS9$lt7p(hn4gHun#hY`6BtA@(~ICwjPA$bLh60k)vRM{o1v?@u4!$<;yJQ*fX3^% zfMM%^Nhs)rc!4@s0G7ZYS5PpWrLTAb_HrHtX=Celb5w7^WN^ zUwkeB_Q7^5+fJ}qvYKfgcFckA6ZBMuivr*YILM^=D{fIKd#VeMv3<2oOSfG~z?oyy z(qX_RKeQ)tMd)WIou+6l&CV9Q}uRb+hp3LsY&gAaxk$$eWwq0=_ ztegWx-~+5lynnvme{GqCtL_hBzUBO_Y*w?kVe$6A67)zetKQ(0J=%PH%Yv7))zT?d)t{VzkVh5#VE!IuEBLqNW|i_<6%V7;3ITfZ z>zQP%IV{c0;ZEMkPAB$qja$hndwb6UWiRL7-p4@G%LUr`?Tg?Od(w0!n)Y(-K?={p zS_4=GGp<;FY6OnjIN+Ss{~tT~qg`>#s$lX~u#We>jdT~*a>@qtnw6%nra6ma;4RAF z+S}^!x5Hf2PR&3nKv1qKHpFH3zY~K~K5c6879L1T~&dwsi=5h{fq_^|7(7h;p+?OSWyuN`3D1RMOn?oR-Y+3P>= z6DCV`YSv0Vmh47PZQztW-zgYcfVjT_FF?F2VfB#zI~YTCkD6EH|2f+KYm)!hahUfh zepXqBea9({Ioor^@)x0evteL!vspMQHfl#0q1s8#MpdSy;V4Fn<3;H>KW;q|L&e(2RFZ>8{ z3Je}0&-xtto`vCjBn4Rss)6TkEP#pk49tOTMzH;0lh3@k8A*@L%-((@mPxT^I4hs` zpTrBgDxq(Mbb{s``en4tMx5$y8vSw$JjFD9hh5~-@;IQCdGZu-=7(VT^((Vn{@grO z7{V0ltGbsy+Q#rc=TrDg;>}_~@6sL#! z(;Jza)ra}hTfmZs>%;x&17Li@^%4H`$xk^w(w{!Ik<%~v)92A29%>!s&p3k)5jfYM z-i!`I^)deRR&*GukM*Yyp~FypoIm|9bQr3S_oq*wLqv1%r+-%yoaj$qMStLb3j7({ z)eI;3)4S9RC;QVU)C^ztr+-v4oZ?TPQZtGaq9=~b9OnEtvyJscAV(--*De}T6P z)8Fu?&*rI&h5n2s;KjoAMgH^_q(k*L{pmF-{gyxd!B@=RzwJ*SgxKKH-|?s4L3vme z`_rEw9jU+PPv@;v8B6^cyCE<|>5Kj8ku&&2E6BHxj!%~{vyWS4n*iWE=3Qc^m(1aG zem)#W6-ii$bQr$d>1k*$47yLzf3#8p>vrh;V&j(dyC67Y+s0aF#!gx5by^@vl^WMtqq() z@jrXLE+ODRqW%@~TQl)lNP#`DkeHyaD*!Uq=yyH=xPhp~+0 zwNjH_<_@b`sdWk;v#r$kzw@vgSgDu5Sw;jvl{XEoM(A7Z1$haaS2XMotkTnVrJ!BE zL_85PaFjmUhU{VJM4}MC$|^kd&txR=LYq15amP7XXeY0N4n^sB71sg^nBgdW2|~n~ z>0d#GqV$z^a?QbDp>OX99;6NVCEIzs+KahbrEHKDK&*trkJae;`3y1}NCAEE5}>20 zL(UueUNAGiYz?EFJ&4^<%>|hGVUWGz{4&$lL(Bx&gSY~h`v5Qf@+Ic%?FByucUe#m zd-Sh-&kJW)%-i)H3y>~rz~3xoT(zP9Iz;yXOHwqAQOs`UQ(`XMMzQr^SEBtrzWf2t z$p*<{h)*y#v3mF%7#2_mT*y=`9J^G*gGn%}nWpa@ zWBT2fAX(5c`015i#3aY5&q07@@O+*h`R3BU%_n_m4KPpHSLllyqitAQFpXlD5q%#M zuzW9Q-r(xbuB*IQQ^e)gjLc8RA4 zUeGN114tbX1FPamC7Ib^`WlPEYHqXSV~0uHDMzcUZ?@ z!}_I<7<;hnrY!c0O4?maLj;q63jFwC7UFCS`5kHnK5fmxEGl4nZPz;j)CwpkMy%(d z+1;O4noS#BXRB|#)Jhky1*+_Tw5xbnFs@%iYZ^eEcMy~yAWAQt!r$y+oG;{*jXB>z zJdd$4N8i7a;brf|G5I`ToA_S%3hvecrP{`yxT3AwSO?-3!&^n21bZQ@$6)(e^B&9J zur<}U*RX|S@Sm9)`Z}j@46AQv(S0oAgi3v|KLr!Dd$@E6_#Xo#Fh6eD%p{I@}; z5!l@NHgZd_c3{p476A~iNi~WaB>kK1ko$g*OjA$1?VE)MnK<#wg);i_`6JB4h^Yzs z;X*5c>n4594%A8Da=3NUFLH_#`&Q%KcO$*s><}P4P9}Gf1L%zqAAFPQDLr?&E4ZwS zul!Ng&ZX7w88_P&3$DdRS<_enCKh!U8xO#2qIRe9nJX4AHa^hG;@%nVrphRpJKZ#q zjoTlh$%$R6P~lP|JhX=foTb{!auaF5d&cePMAsg7yCX43Kx1|Yy|Gkvws)yf+cvTY zg^`7K8H_I8ThVrzvDJz9t|K~?Pp6t6;`xLgbgo}pFZKA)2zSBxmCl6^NTlaJG;X3g z%Z*z6M5>PiW2-=u?3X-fIoj_}bC(+rcY#SUe_;z#Wgg7t7cL0$UPS1^`)!DO3cIBo z9|T`KRhdT_bwLh^?Y1uf-cTHMp)Q9(qvibI$ zqkC5xSw2h-J6rwd5wOSN(66j(fVJQ+;k=}@`y-xEmm_veUd_$HG99(TT4Y!DpB+qJvU*f)YW;D|bEJ zIWPo)cPhMdE#D*@-9J$(P6*>&Irw-D$-m0kpkIH)O8zP z2d|=(ZODYV9Ackq`uY(~I^f_xhwxR(`bbx&m-|Nzk`F=|LW9Tdu6g?CiExgf&FhVp z33HIoSNf)*3GVCXjHU7$j7(?YM7n*0;mcy1KxCFERfr7J)dA&)ZZI+`a`;U&~o zjb)l2eNljWF!;|n9UKaJ+D6*A0VYmkPe*&+)$s0!red&T^!f*Xg>V+=1Y02Tg!GZy zA~_2qW_oAM5k8XcKo34m_2p$-ERZ>+rbH9$*Ka+1xl#dSq>j;X9?orQbnlN*SX0V8PJ^a>n70J z+0X> z0#9(_*9lRoli6F1%v)jR&R>8JFp6E05{)O;LzI<%tC%q4yzgSGdAPu{PgjWA@pz5m z%vK|i^0}6(|KFU^yAa*=Y z*GmJvZ4=WV5Ja%8x|7j31w9 zQ}^&O$D5v`0S8=y^iRroX-Vt$A?3RQzfIRBa8Eo>9FV6jltFA7_xuo={71_Kdb?t) zs1l@k={oqgW^OkU^ZYa3uPH257WgKXMuS7}e_nI#XRMh2^ZIK)hXsA!bnRzY&!aXi z+isL|ezSpgZ#SCYF$p`gj53S$hQiYk_Bb1y?NaET9Y*8iEnxEi44hbMJLsP;!109@ zJ)hGyAru4<4XxW@l;;MI?l62!M`|}b&am|r-!eK;HLK}Cv&UgGliqvckqSBQ{}fZr z;i&K6K#i+^imB?rdyy&FoE+nZi9CF9v&(p(;X?S-D68sTjBrYa#-Z|H<^-2Ela52g8O&VtLB@Z5}b4dcEy#PpfwumE&F>>w@%y4G6r) zMFgGOZKPJ-&Rl*^6+VXDM)8yp0D=kOEhF^-e?s65U8~5b7*(>>H;as$65l%J(xbgh zI&qYO^r)s!6&VY)tCUYNsh;`C)055RLH_ZN{o)ZHW;mX4$AM98hZ9UBmeFqF;2vY6 z)kHWq0VWfs?6JwUF=8et?DK!kh%HKkc=#z8w^|Udi_Y&gQp*Ge4~TQO8iS?{J+co` z5HE~I=X^SVpg1ki)cOYPgVew| z4cw;*4wIn=f8Th&Q7-;m7$guywNdUk3^AzBexq)sxuK?gKcbe0R&+RX_&)|nbXHhk z^(p!bV|W>Jg&<=A&V0aOe)GRDYLqu$u(E;3@{C$_L&(%vVPF_+EU7gz-9YHlW4LRQ#J}V3d7sEIs{| z;dAZ4^I+bCI5_&!?FWrI)mikp{?=iXh5`Wq_MCOm_V(^4!7QPpDNP9fG0=)B8a zMDc4MNTAR58@EDMySg9Z(iEzFz^Ib(Bw{Cks%iT7Kl73e)j-~rwKVo4&eA6j7{gHX z;sK+YuTc9NE|_jTY*cP|ef+?-zyr^W<#;cIHw}L9>B$Soebdy#hOgzh)NYr~JSa%TV11pJ_9pz>Xj;^vglKGqPtjdwR0ZL3fk_Vdr)ZL9|7r zsaW2nxU2Sph30z%yrgWuk>)^Ry-7=ze*th6fkzR!P7!0Ygfj$}FcUv555aAhmW9E? zN);Q8vw>BRp*?q&^L%_u6l}n+I6QCG1aH9M^ei-f^x_TLPD7^j=MSTK& zaR@;tPh@zCGI${-sa^QNVMs%Lsb|eTnUtyZ4^P5*pdOBcUn#rw^jH3wbneN%Rs*MyVg|iqhwvMRYeOf-h;TFFk(*dKu4S^x!cgwQ;F6;d|UN2Amg8 z8f-5- z9wnbV<|wbTMQHd5Bdg3=-iKHbr&=DoR(6&yUNF2Aa@-i^EL={bj~llo<6v;dW8I*p zP^YvbJ{lM1`84;1P8H2Ai=TLRlsNGm?bV6*w7N?D@ z6sdea=rp=>HDg7$b(Xad6Lg!8z86HL) zwKLdX#^EWTjBkvsuC>lI>OHz&D&4=m-&0(9*AZ3uv1j^aQuK~~t?AE`M*Ovv%YO^^ z4I#Xq{P6#7B$0&P~r4j}+_p9gMG7r@nKTcPVqbc}27H#+MqU{9+8$ z4$z~&gO%?~^L{tFF#7%eyHW3EmfrA^DxdXuA{V}AirQRf({#OP-05UW&CYu3E*jxf z^s`Za#kyaN_ndU;FC&xQ{KN1C)&=6ZTGZ8-jcSq55ct4`_#8AZsed_&xMH+uZfp5) z2tmu|Fnfo6d1+hLk9c5>Y9Pu95YL6X1Db!je-aJY+A*BozJlG>>#7k;SN<@(*A651 zl97LH?s}KVqVlCyI3FU?X<&@N^Ll?6h~Q!)t39t1;UbaF{9)9*_7kesq&b(2GSvSv z;@DhMH9u5TqR*}v-sF;>G%SVN{VpxIs)7^jylUKy)tcrLZM6Q=`iUwXem`RFQ8?wh zd?5WeIzpgGfM+pIJg7ax+h~AO7<4jPl%W@+MJiSQ)985Zv;fRxD*O|1gi20}01><+8ZF|; z`Im9;wci2EECrEkKdGv5?XV8}|1x@C`yIf9Pvh0n)&Xl?n=(T&>Xa~%4(vZ)UDUag z*%Ebbb6`4-Qio&B!*0OLk$6t9Gd0K|liZhnWevzf04>WgRyDZGqS)Fn`TaQ?qMxi{YD_azezN*A}voE|wm>S{jz4k-Teb z0YojY%>{HS(3ofuOJQLEQIkK7blMvxyuOmFXCkE=oEi{J^Zct8P5cv@$4cR%lznDT z!%feJi_%xR^vQea*KpuRc$kQ%$0LA{%V}wZxX-zE0!2oO3i19?!T*=p!UD?cC6g$| zEgJrtMQcXctyZOhZc&4q)^8HtBnR|wf7|@OUkCf7`U-C}#^nakcvmW*4ZH+3F5q2< z284^UE7rw`VH&MU5)Ej39OnFV8IcjkbW*)c8qPBCXw@%9NcVv2RF}vr&IFu_Fdd^4|h3I)*vS=4!_e@1GqS1<}iQ>5C zT$W8k%8Dupi?i9WkJ%B2o(_dNU_kLH;)T%D8p|3}QbdJvLEuJ7Pk{!ts>A(<6E_Yt ze?Y4ww-cv@3%d~aEp$3lG|uF~vG+cBUNxYSqigLIi!i!#UeV5NkIubCqoTX}mZiU* z?Hfivq=+_rR^OT`8eh8|@>9j2Yjd?U(d*jWL1`kf>OM1A9*eDNu8@4axQBUDIo9*g z|C|IO;dz?gO%o}VN-14R(I3*p1EI4Kh-oafEhp+mFNd<+$#NtE?qfZ-lZ~^bY=@?| z=O$5Bx)>C;+yzr37v*Q?mZM2+qAKyEYkwmWoM>cE4bg!c8B{@(FQpOvq)4J+Gon=#CH_hO?d`7d?_CdjE&;_@IJl5~O=Xv+rOMSMQxztRnOId3D6qb6_O`>xdyD26UyeaWccXkb-|5F@( zwVJ4vvCGYa!n22HhTHuQ$5i&(F=2WkwC4&KqW@rTI;XlQ{;EizIX8*MH=3}gR==$O zqyw+l;mk2_prCH>Km!KplV8ckABgQ9H$7BSWXG7`0Rzh5p?Nh$^I#}ns;P*~^b=T_ z9<@Y7DXXTidR#5h@qdH>FK3I6H-g7Mp?`;Ki<|!!2(Y$}xFuUr^S45M=Ix)o3$YJsFAWuTr)8qHXwFR=H>Diz6}WpjO{Q@crQi;vNRri3!bp zbg+SVBV0EqX7)o?ky$KH>l_05Z*m4~{{p|3g&1w6W++fY1@?#ne2 z)ho4{{dQ3yjSX1v0ZfCl1LQVM=T`**6x<~}&_Z+ybs;+3Y+Bp`t7IM}%s}nF zT_D8k1iJdFyeXp;Rs`yA*0jUJ!$k*l(G#8B)=X5v@z%SUNQ?}0@nSP^k2ah3HWT+I z1&6*tSD_|*(xkb+t0a22xk$RLl>VUJHZM=Tq3(57a3Isz1{2!hmnc8T5l=?K842^% zPmiJH2Sfvi=VuRybSIKybkQdAyH{d?yh@SkwgjY#8fCDPn_*DmbcJ= zbA8(48huckz7^@vIcQbZ-XWA~vwnMFn99mDTG3t%=EBuGi2H&Hm!Xv%#G|RbIJ8hX zJ&f=3vF-T?;NuwTho0R6de#UF78fI zSJBMDH5$gL+etQVh=P3qPNjl7A$KxC#YgCVpXnr4VXEFA`=n9F&Z1G=^uV1X9!4Ka zGdhD)L)(Ws3ooqT&b|N@aME4kChauk+$GvnKB<|vLVOO{!-@86%V2gs=$81syF}Bd z?Z-pa^(T&m_4kOZFa%=a{hxWaXdFK01is-z^?SugZ3!*C7wV&{cZ<9J4?F0o4Wsz` zMCE_Ciyrrhrm=xJV8LB<`7V)R&tunpLGy_3qUJ$e#7yn06}7vHFb#KvIa6e6G#E`# zBx^rI@M}nPzqyrH-Y;${W!qf1A9QUPwRu1^2iV6yAm*1 zzJKmS2cs6w!4y4nh@FW7%vc`tP|-usruCivu;>M2p570O?)bCzVUYzZ*Aowm>J5O_ zp~VF{9+Hc93Gl*&=QzN&;!cClDP)A`$IT3C@rZa0>Voec5n17ux`5&hkFv@(l-I7Vc(RB1Saa@QO1JhDcV^CZ`k)HuIH6$iG%MPp=7rG(bmX3^D_-p>zEPz| z_ZA|`J|dlNTJlrhsI9~rE{`h{ZO0;)5x)+IThrJhMsp| z?gZL~IOTW3>R{1$I*=>c*X_sg3tai6lR!pEGpX1km|*!7HLU6lV|g7U9aSIb zFDg3mH^0B=YM(C+UhZ3oQU-{2vB8@WRB_+{p@Tp#8z8n>IFkRUNDZHU8kh5+lZB6p zd9H81eUq9!CMvm?pXR;Li@9++`WTpl36F`2HD)8Cw9?L1WuDZtGE61Cp{aRDE5B^673UAcb@4|rDu+@QF`y@#5;(;cEeR!boC7QMeIPH`bjB0xx#SapC z_|he~DZ%LOA0)ia&%N~AAn~Ms$Q#=9Ntxc+RIZyb>Yo@y4Jv$GG{p`*{tZ z#+%pu`e^fSR%EUo@+97tKnBG>EmF1bsru7maqI(LWsMu_Mf74%Kl<)z(EEPW#JGs5Iv}(Kif6ds?%hH2*nV#n*dYycPb| zCy4X}Ddp7jqI<1i*Z?jHt7AfO#i!QMQYir?%$0wd2EQO``s{L`);`UZgZnIOh6bRr z@ftL~4Bibdh$;-xA6^jU;|k}QXvl(LsOJ=weNj9Z(T#tGM!RX~j_9(K^H)|3&3jSw zcH?!jESA3Y10Rq(Pt=e3?NmG%Z%CFSG!~zSirSQyC+@z#8%%UrltSP+)e-{#;y0{I z_)KAYTmTdi15C)6MPShh-=kc0$d+7$kX${UZOO0()$_sBd{6E3#i(M#IhyYu4$P_S z;mq&^1T9F6Ji%>4MV9+C=3s;Rx1pjPuZuck?;j@aPMPflB?z<53_zRD49#;jgz|fd z)D=gD38CRoZ!rRg=NytFM0KR5Ak}e>x(4P4K9#j7R&q)t-?1RaHX!{a+{(yznii$w zV>m+v@Ws&$n+U911Ox||u6%zP4~F49gnb0=BQ8*lk>VXb;0}!x-GF8FUlOO$bH!0= z9IZ#GaXgNcH4b?Es&TM-)*J_N%yDRNpWtqhVU9!dnB!0p;dvam7FCKv9>?<+n^y=A z$06pzAYw*~Y8lF0)e3TsAf0TrjX=W~Xbd>Q?R3v*aTf--a5R|mB8nLULbN@FmW;$b z@O@)Mqrhb?sv^FEd1(QRTr>uldA1hq86z454jAj67?)?Xd90`&8#vpXIWTnFb09I5 zlE;Y_+6n4DPV@*}#fn#&{H#`<4viBT$o^xTsERakyu}>ELf;wWgE>9 zLy8qB+1QR5VjPeA{+S}LO7KdQD99wGp0fcffgg`uBF%Y4q!#O@ z5s{%d1`?qF7rP6%z=3;?X0l}@ zKUl_ZNuZ9Mji<->OC)TQBE1nZun%`Am$m1q*a;FlCE!$UM|ov7xu zt#8l-6e}=^hxH#SgzDA@+P)4Oa5kl_7u}LdHMya&>xD1=W5rQ~@spRHHFzOqIIUSP zsydH5X~G7Pde^rJXc@tDpu}t$6Ur<}DDyei(GFIMk9IXXWaCA7h@bege`z7dwXwtM zLxFC7!LxKrsq+Srt$jU*du?)ji2YzIQ~~Vtc*>DWnZ=iNpXgoBXbL ziSC)(*W(v)U2d9xw@jsX7r~C<^|wK)UL)^2BKe;+nomEy10wX%KON8t49KNfG(Fv< z(7*gg{cm3^PC>i%{t~EXOBD-PrHx?AgJdFwEEToGW;?S&A^101DiSm&xSCGOL>K0! z-drXg2eVTCeNo#Z@U?%<>YRKiny?s&xP!uJnXiOvkth}EKUWKVu-2N9blQ2o{7 zj=a)AgGu5}60Z16Q(4r}Ct30iL<=~|Vn)~iI`iR79MyB;TtbZ-yf8l@r0SUtDW-B1 zBm<$ZEQTBHG8dhUZc_AVc*xqRzYYn;ocN*wN?C*F7G7KKUl+o<)TOu;;^_YyYg6Ih zSR3lP3f$=bf5G3@Iyc1{(a5@@TLC*8zQTKNjmV`MpNN|)URfWlui5U@KYhInQ?gd& z7~{=I6Apd!m{_F%e&G|`@bsc1pNK`3r)tVs8V1zRUFX6UX{#OmS?4Efy^eA|2kb-! zwQZF`EC2L)=;F9e_2RzqS*o=~__cxB(>#P`#Vdkj6su^a&(gUqVmGwS z>pvCc{8u?wJ{5KNY9@PYsaG?-wu;fg3N}`j7SP45qS3Xvvmch_=)rBcN(10N+6Jxk zJoZgU4k8`$Vatl> z8Na5QddbkL?y2Jgb7;=Gea2E!qcziC3in0}(k4p~s8F=Hj3j zcx~a+dvFCXViLuCE`m&#!40UU?)Y3(bm5st8vMCvn0EqEHCc@G%m~GvU>iLrC-td# z2NE;U=a_%lCOd^+NJSni#51km(A|_;T(jPjETy~;`$2Jjx(uTkUx?1y ze){1HY*dbl!I~TBEdXQt9m1E$wBd!yWg;uT)&zc+WP4XrYJSXF{n*@+YUMmF;% z)q-2XDG`3tS-u$2^lytacC9lX9Gbg9MQ$+@f57;FZ(hbz?02GK->IVzwhHTAwI9sj zFj%-hsp$KfzV0vrwJ4h{eqiP>ubMvU2tv6iVgyaJ`DoJV*AV;^4K(a$rhj`WlpDm8 zVf;`3T=P|4uUBUD~jD>g0-LW$moMdv#H#Y0FD z>mG?6<*;(sMUQU|i*{&veLwZBvoRO0EEV5@W^HwR%O6F}@_uzZRPi|LOQ_-}{U|EkY8P>O z!$AGBTzUux$93o*W9W1CvhWbr3Zc1i=flFQ#+vyszh*v-JS+QzQpRcFjx9bd(mxcH zspE1P!_(=1T2#5Ym@-^7gzbkhDWfWuq_Jl$y?8HLcRFzQj3*w$Ae*YV0pHSs-yr1l zrTxE&sjPt*@H_0A@b~TCMOqu7;wPxL!eEdF??ko)Dpi2DJdv*FS{QRtl&ilLy6cWO zqLd9SKSYG_!HIEG6b?tfXwA6FXB7@HFPwP#dCpMJi%^DtMKyjBzVv)kvQd{NifQ26 zKV^--V-)rKNu;^$5>D7W75pS_)%MY*pG1B4h{LSD7^*qkS19z1sG4UN1js_N*y4yF#YoZLIlacYKu z`Ely2@?HARN8+6NY_R}5 z9hL*C@>XYQ6k`MI;2Z08fzg1Z7F5e>imeqe90%0q_D3}@o+A^H5O4EPH9wY`?GlVx z=rjl}s*ai;OXt}@D9qEI9%lE~Sy8W{njLFG81h(pZpPYPn!ez0yqY?`0DQ&3gZll? ziHdHsK5l^kpjqd{1lZS9Jum9>F6ez8obOCpa9%WszhYh!Gv26$I7w&Di-Fn<>iM%s zDQkZPWbl7@bxA>$Cj2bY?io79bhpH-(%7hWNggJKHi7q%KhqpNfaJ!O;4@E6259Wr zkcla%IxbGp<)3kbF_UsGi1zpco1ZkQ`kSmmyDo@(&5Wk>@Gl}S5;w@aVu)Mt<1bJ} z^`P`$#m&(@6d#0*z(FkT`BgmTTr!F_|0-IRGxZJ3aHxwctZse^$3fuRv`W8;3T=zY z|A5Bd%KvzgySV(16po7-H2F8!Q;)p}f1T5``64dr=FqnnMb)U&{7kV)^#8{7f{#~i zICTk;92sX)hVKX3jk1^7X2l%_+;PlSE(nvvRIG1D((g-9=2LElsUZQyf+b$mqmb>*1%Rv3^<1sXN)k$fXxArQR51`3D|ZnkFki^r)oC zR+USZ;+C*c&6ZSfCvJ%*YqC13On$R4rM#9nNHc* z;-wEdrL--tSr6|y=u~tAregQGH4d$@67B+xpAM5B#+!|sF0d^7?WUp0vMSFq)Rf71mf8Xu zlpt@%{#=qE@5H{Go+ul)MC8*-$%64=2g{A^d)vBwNRI!6L9uo{u2dDAO$w^7Wb^Q7l*hEH=bJGC&Jeh6xrt zqiq$~O`(ypuC-uIBhe9r*GND7SS4>Q4#TfJb^88ZUgcg5wK6;e)KTSoN6QY@5Z;fLUC^*QMrI-UVa*s>Xq68hNpSmj zuJ2cydiAKGSVPsxL$Pu+n)oqRHBmcLR;7Az@@Wg*OpIWOlF_YmnWV}XWRSpO+of&s z0#sP|1Lbc5A z%WkhMv+v}M2N4|m5FS_8J0o3LkbE3!;L4p(l}Bf0u*z^uGh9v28%FJ_$QF4s6u*n* zt>Mu0hONQ*h3d|JJUW-&5WI)_j%nxl%quUvf$c^hLY5l!D6AXMH`g;&%ZkE);MK7a zPgwA~ej$1kqMl$QI1zu&H7LueM?8Vw5km$y(sO=r3ACMCRwJc*o+Mwc&RFx?5F+2+n> zLSz;wa?|?B&?22rkzR{zmQ7WZyG?2dLcsL6i0Lt(eC^T{(Vmp%r$Hvs=HroRkVOoG z4@f#)PWH7(OMns_AmMR<0dks^4Sw+!uXqnw>_=z48Mu;8l!p7u}F>f8&$+ zxaTyo-BUho?|R-Bj`>Vf;}ym8xgHsRR||dMaWeM!{mw z-ilJG`Pri)8}1fCmzI#?75BtpAI*zPL=@$VOVu9Ci4iTKl1vW16JZXr08*}hAG+M* z!|3R(GL1G=mz@Eogq!8=)a!zYF5fK6hnlb`Uqe=B7__S)EAZdPYM8KCUqd$S&9HEm z3Jc5}<}SgoKq3GOQ}7Fd1!tJBz|1(|RyViQtEMbhUrkq4;px7`rVyqL9QLXeg&4e>MoG_iM^t;V(z3CMY)xml1Vq$@gvm+$*(Y1q-+pvt^x3 zB@U~_1odO8rFJM3(AH&o|G2&i`#z5An@(S6%L+F@!G8*N?$$!V`)kYF7|GLalMTa6 z6r}FA$@JK3ku9lAv7j0X-KbI>`4lkgl{#{J#p`00wYU(5R?zrcWN%bBbBo-5189AI ztGpMbs@A<>spxw0R>sa|^-L_4^<+n$%!+#duVJYPCqI@_etlUsSl~9Xk`~sNc-m_M z9jh|!!bV_W!T5m2@zT~UzO-s%F&;B3Y3(Z*Zul=r>{wp! z-X@I)&eh^LwY$)b|}J_=fH|UX9iA7AN2axCw*BTcfV>mSk3$G5G@#1as*TOah?* zg%hs4Dbs?ce~ozTL2FF|8p@h9<#t&sNxc+Uq`}n9FeDif_t0F8qS@y$eAPiIwwt{0Xgy+=am`sT@L&^KF_2$U3S-w zQh!}Gg}zZg?@XX|y1Y&MkuK@7O3YD@@>s($r=xO>X0i}pb~Te3&_LGytGPE62I5dX zmT4{rM*3}lsB;UMNdsQ&6VF#`A2*kE`ETnN`(#ns7E+lRv~3~p4c@p2AQN>ZcE9oHSe~R4``PtqLr*+@o)`W$vaw_;4`Ni#?xh!M=%(`IB>2^n zf*B2LV9VLr={`oo+R7n`r2xQ1^M}Gi^l*FGq(bnX^mojIW(@})@0k6_c53$Two|j; zGrnH}ga9RS@YuU_kR5m(mfaz9011>DOh$VJi3RQD6IF`!z&9cG^h)%S(?OO6K<(y~ z&&9_bWVH4#`mBS@DdrBu-J>1K9^R)cYZE(lmgUQvjFvTjmwQ$i>>K>TD&?>5n>f8& zzX%%FQN|U6O1OmH zA&Vs)I^9$0h0YKaX42c8Z>v z2~lLvL>@nIOx|SpUGix&MAh`WrPm3U*4z9xuAS*I0F=E8&$bi`e;;FSzGxFajXM&U)tDJ zR)`!L=5qi9YbVm#uCijpXVcJT&F0wSH_iKRif zZrfy;$U%LeenTI9dtcck`aKoEj8AxWHt8#Gj@y-@sDR4h`-o5a%DUQCy4Y7{B-v+= zsj^t~x-vhe>iuN7;tk!^PqxM>Hmjd(%hnX8E|jwGZ11JxP5MWM@SLgLp8gf6ajuM{ zZuiUMSh~g!$hBCk%MYlf%jl+-u3b0((&3Tq63#}*Dei2948OAx&F}VaEZtY##%X_>;zpj$~y8QjRZq%;}nA)_b9Axer`mm?0r){Cr zJ!N;>#^U#EGgQ1CVO$AsZ3VP9B&p|uqghOpVh*K0{_Z11a=lQ-&Lk8?Vj1s z-5B%&QozmXPK_NpRd`e<^qZ{Dfs)gag-w)#RYFHqomD->C|J{xitvmYDceGmwPz$i z)`g;80%vRV_ur<>>o5ChW2w=jG93pMJW3NN?≈6g#SUGIbpwzb^4{eLERWKMlvn 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�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͟QWT;F;i^+_zha$ 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

3@ypDdL-%s>K>Fo~zxt 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 z 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

Ho3w8k3*W6LUI|Gs|L@9Sq~ zcCMewEYtWI#CUAa?TmRV8lJ5@0O97gzJ=X%u?C)G2dWk%VbaC==TC% zyu|Y7g=NkK8$KOVY?h}jowK+N7!TYfX3Rr2edp<=D%<9R3mbG5*VBsU>309bvVL#@ z`RbOlE>b1w)2}xU$m@y8p}=A#;T9xRj4T0+&BG>)oMdwUQc-n2H<2s_E)Nw7F9XFA z8G^vsr&|}yVDDHCz-*pJ8Ay7F$^?y(SMYrl`d7pjXTz-D%+l_yjE-m@D=5xvl|6bj z%dFo$vu_W2d;ry`39M9z)hI*}&uT`Ax0|7Dgy&g`LTROo zU^3COl`vmxwgGN5X+&xfeLJEoqS`YkTD^sOQW4uuM5wZs##!}P6i`39gk7rC);&>{ zy2WBxO5rWW4=BF;k-brF;a`aIJN7G{nDU1Ys6rM;A@x51vyl3qW*tHY6&|^I+9EXL4hH^#B728_*C)#Bc}CBV1e97vlhi zT>Mja^#wB-GTF%hHxLI%BxXf330xE{mgrA)cV9-lTmxuXOsz=5*5z*tycEG=pMTz< z<45h=aC4*oFGM8u&ctbPJuKb3b?Tkj`vNW|pm3ya-L^g3TT zuOt3%bKD9;B^aBd_XZ*!%W={z#F~$IAp_bJ%pQ9r^(;KU=eGF7jfImj5nwT2H<_oL zPvi0dG3}$)pzeYy^-)G^^FbR6B*X6`-ppnS1DX>FU6T5+F{oU`C4bmBU%G)0jdcBK zg5wy{enmp3q-cZAM~Ex+X2-YlrMzdol9yx700gwNNa&E%T9~8d#PTt#^Ib8#>)(77r_{jRIfKdjT9}H>8UmLjgDbF!+`bx zjA2PN<(?m1xR>cEHFk`NVLZx!2A`Y}l2lVHAcV$B#wRz8HyF9a=>P-T%kUCGQi)$& zG#h4cg18E~=}v+8((xNjaP9@{$001g;8VcBL@?mH_-|`IvS^1`i+?g=xzggF z0-|J(e%DD!F%$uieoy|Bpo>Ax(mqAGzkhP+z5 z03w2rT$zfj1yMqBV`T~_AHIv{w%*LT)Cy!BMo@MV;SC^U)^BEg2tMCN(QpMux}l9^ zztIp8^Q%^b-^jYtG9uq_klI?XS&w+ zz!o4DW0C=%G|4BI?LfSArm)~G3~1e<6hEoN0hde*_Wv#(tkBbI%-?0Qqmx+6fTn}p zC#hsCP5O3=7gl1>;q(Jb5d%(*E7#u+4)0!uvCE^2r4N<~vwQckVE3JcM-5*yHV*JLHL#8fxzJLDz*vEq1O_Zy9?t?O2365t}Lfavci_&SX z!=j=`uUOQ2R0@FOY3#4G!Bm z5KrXoBfv90e?|1FXHTsFA7#A&G~dE9dROF={?y%zhKR@|5UFoA%&_2g!ls>?G;E48 zeb=y8CR+Aa>{n&3H7nv%q`#O1J|TPs1Wx9~sh>DH`I~;-a0WacXPBJ$Kq*W%bO@nq z;@m2|YC-RfD`M$tJ=MaUjyC|x6MKU zk-7$t`>x`tjcp?5WSu!C9|DNilmbQI$yp5obQYg$yKALkUS}-$0P(C-LeUy?Q}?@Kveo z=c~hlhEPsVTquYEakpN*sFL9}Qx00p6b7`v(7;@h`Y;33FtKh8TJgXUCL{WeaSZU7 zSSJZho|u~>?yu1sRlhefhA(Fn`Cumw5?T=y%rRQDU#r)veqE2@8)PRR*6MW<8vT?$ zMoeC-KmGB=u_hlZHJ1V2LSh?7zFjRqjR#e#HC{tIv~Jg}=hv3DJ)mA}vYlY2L&a_~ z!2K9j!E~*gfgc)f|_LK!2IK;Ye0T}pt*H%0PP!~TZw6!H`T zF%<+x=h)BC`-fiGo`{Dxoowl~Let5EVROg{0`0FyR*!7?MLP~`>eh#o4c?g|VLf&f z1ZR>J3JU%Vg1ZW14p#BZmf7|P9GFc$SZrVp2xN;Fnl5M#JmAsoLKMb?c{h-l8^X(= z=<}3Zc&gr6xURJeGM~Qyai*7C%K#g{kA&79s_`uZ^;GNbaQJ9&ZA5+OM_gR57q32Z zaZJkP3?!tZG9a6U4^E4EL{~V%nZlIr%! z!lfJhPPlFDHt=(fpk%Gm5KliyR_fk!5>(N;rZ42#S)29r67JJvpvK*2l*Vo642|=Z z;XKfM8n<4c#?vZbI?j2KaJet>wi^cC=R36Bn-Xshr*exp{HOJ{ zf%gI)xI?_svv|UHh{JnCA_m^M6Q0Aps}p|HQ!Bxnh3}C81qk0)3|&|N-vcsKObb0A zitIxV4V2k?t>O{O_dH5s4XgZv13;ksU6?=m0?F_Kit-Z~P=LT7gMkHb4-t*GLc%{# zmLX(70sKQ1Lmw6Zoq%M(H!r?nWI!2w!wm+O!I`5NUPN(n$N(L9M;Z()1Kd6&q}TF{ zCW-=hbOU7p#*AU0m6~;!HAZ~1RWJ9vdn_VLwQ1dsPEmH8YJ2nW@nklpD5fyL^Uz%+ zw5n4g5}SCLksy{{6&sugG5jO>FmZ+xPL`d$K<$v`w$w-#HQSrPK{BCO0i4 zG70e&I2C1nx?&DU`IQ75n_~(XcrPffz=e~&J{3W;l!K-rknn%7D-v2&3=Z_^po-&| zT3mZ$yfOO`CB|;Y&8#6OK#H% zoh_d6=~bUQJO>d`hrXhRrjxmkrOKBrt(5k-vtWHK^s^hf;;q-=jMB2gso*DVJ;c~3GE?-`Bs5S z>Wp*vJ9jno0Qc%#6Bcgg$kf7^-14rKl3tp$K1R|)1`_7M7D;FiAjz`Nily*kS!+R!=noY0?0Gbl|p_ zWaAh}Sd0Rb(5g-Ynaxi=8!dXTsJat}c%0f7!*`Q`gs0F%_mgil z_^b!SCp+~DFC6~EJhP^B@9%fy?myt2@^&ch!NZe)}m4lqqk z*zzF|^1xLdv5rT2gbZmf!KsFhkOyP0&`}V@xU1Z_Dqz!bM9B69BRjx=+?G#5`>r_5 z^@M1-3kPiCBb9G<@wRGBY3dxGidkrEhAFI@m*Mv^PdG;%v>D- z?m9nVx89(%FT_-8ZG`4^5wU6FgWVVac`u3V-8jF)@fTPs2=}33<%;oJY!u6LMJ(8j z{XBYD%-93|6T5XBK5bbE^GtvMB}G%#8ht_ zIt)enhKp){Kr@Z@Vj(9q0&r0*dth)4%sWza*vms_Mj<-cNYjw-l$pH&dvul5#iRjy zTvGQ~CQTDTV48oNxV9II6s`&2sUQ-@jVdQB`}CrkPlzY?;ahy?L?tO}AGp1f#JBt4 z*d0?;q??hRsbb?k7?D0*Mc!eg+bI(FBRRSP*1=K-kIQsm=ww|##}x_vf-KU1_d~(X zIjmAsrG~sJMdm8;Yr#{-F)uECc>Xn!(Z-%CZtmApD(DL-pot-%v8j{LA|>F30}xEiYQy-bDh%GeS#F-zcEMFDln zgjUC;^{zEC|K<;59$Xijc{HtOgUa0V2Ub@C-Z%m7O$b&H_JeqM;Xm}E<^7uxftNA4 zbD>+`hUoTPzlo&>vAw$)9>j~P?XU;)ZB?9d=Yrydk0q!0;!ot{-EQFAxu9_PR*6p` z?%AnuxpP6`@Tn3H5O?oUxZJv+aQISLk`^%~f!B5IQ=D=agW`lYm6AFfge2!53YXg$ z6dw6g;W@xl90A~RDHLm@Mp46u$WSLmKVo2VD}zcLI;s*E2_UiUxWOQID<}pyN#~TFsf%Y1fgyO=V31p!6$AXKEbhxO#l>(ga8DP z{~p#~D5yWUCRQKTE2g_2f}=D(*88?wcE3KBF8zA+!Y5AfW;V=@9LALbt^wCE;rwpb zZn2>CCsFN)p5EO#2;dX%s~ZdD#C~KjV$^qu?ACLJAjt3Q9g;wA?HG!f5`8m!WwGFyRxFIEMr}C)-GHm##iG zmE6HmaojffN16Oi@^CiBKLb?UB(Cdc z#a9Qz9N*96lT!qt_{RPdBaaoxBS@63A-F^Q z7}P61>DftkzG!}CEV(>yu&)GrfGFQO1G~gJuxsu;;t(<{?%!j`aqXLM631}(_A!j% zvhxqhD+qb!Y42SOdFvq0OH^*J_*1-j67n1Y@o%Ir?g1y5aZUYulz}twt@NBkM^~?UY_A*?9_3;rg}Y@llb}q8%bjInKsJ zhR*w56L4$d00s#EUKKw;c))zqQz;{GJKr?9!vO!`1~}6KY;$BTLj=4 zL$^UB*3H5mp5FY7)EhxqK4$YP%rA_Lb|Ir6Q9ifeT@WR3W1e|dGLm}k|NoNuku*S* zPco2uT`Prq8F0=7#_P<}{qVYY>I{xS^FJhy6;}BOMA5p6;-+&vc z)V_frO4h}sGQODOL=MF`@iE^ST*iA4xp@bX6SL;t!5~W1?bhrCAJUUm%5BQcU3<@XabYIiKIHI#E+s$bs;97(`(ni=!jv@ zWk7oi?6!$y|2WESn}l#ZnUg4aUQe!mYOg0HaP1P5Ly-3igl`Z@jN~XJUlIi z?=k~?KoJre&n$^d7eAcWYggYl!{mdQGYpU~OhW62wT19ZvGKfKt)Oq#4PkF*Pc4l? zhGqlBm(X3{3(*yn4C(0~1znU=t5Fk1dgdcwOoFM+aB3mA0GwGyV1daAtu0%`0IdVr zZ()Elf_@TO|NfvBivc0MN&oq7#K>!v)#vR-Gb!*K`Y=M8W&yPnREbx!vO9j4iSMl6 zY4cBfL-`Bh%nX(@z@uQjBoej3rkD0EN4U(Z9bU~_6f$P^tiO`8o;+Bj!>b*ze76D- zroe>^aDu}_LKAoZo|WRW3phAiUnK@y!1?S;SCIux(Y+c(zMjXn_J&$3#2C)Cj(B|6 zGjIdq%*@6y!2ZWcLK}z7oL*7lA~K6?WM*kKFy5HBiCoCfu^B|Z{K8vQejPEPuWuzD zpWnr8h%@ucWk9QhY-~PIyx7*Z9YpD_y|A`ysf&B_8aH~<@^Z&E?1^rOy`^!db7k7# z?@Y+ihjk~Yl4=XABtxYVw_xCYI_H)-^A^A;^yG&ZW>{nMyI zHSh-iWO`O1co0oSEuLC$=^B*NAtKdHd>hG&C{{$ej z3TqjV%X=iW&ymy@ydf4|#rYo2Q)2IBd4(9De9zc%Rz2hXsW8TK#N(f_9zvX)H#KLd ztDvLjFAYX|K_z$wJBQU#u~=xnggCQQQyAbnu8V{^Nc}RX^rp`?vV53f!I4+*TjVfO z1h42NH0u?XG_7Jq80%H=c3$E2 zA&;aSuIq=bHy@L;V<6(p;v8jw>-r%Q8sA|;KZ%#F;vNd`U}3+er#)94wl(B&F{^Dc zVs#F<&#WPlf=Tjzn0r}JCqgR0Q+{dZz7mbTP=uVcrCuzFN0 zfQ1u0(hBgZk%i#RmpwW$SwoB&!%GOqXTM`9;>_%iGQeFFArjgN)G)M6thkPIzr46t z61hB&o-+6=#l%-~^~xAAI~m}q4gnHcA&3d!a;VIkIc57VTOGr=g#qpd@srRBgVDbR zRI$#OZ#VkD`Rig5tYv`b()dUu7BW83LwG&H$=ILLuXA6#Ms_hS0+{KINxU3^(!~?t znY@hF?jSqwMsfOv-k^|U^G!`;oE(wzKKzhp3*dYe9JAGsq~XBLZ&c~5QJTl(B66;)DGdjiLDLRox*Yp z8=_9aDtD5rIEY;!ino8Yt>xVxFeB0!%Q2DNWJ`a^v4=dRVUGTI9+d0)UPSTvvfP9A zA)r0OX%b2OfYFG)U;KDWZ&2gnff&YI2DIj2wEaQqM=;v{6u;lnThuspFoy9a1KP7- zv<66h4@T=DGS(Gu-quUiID9yU`!WL>zBJE>Na_c?14WLA0k`!hYwSA~!+3@P4PP~9 zge6rPHW@xHcHQR2?i1pzJ9?!WJAyF@jxwOVjszh|$&unoQU4BHr|XnV@bae9MgmSZ z9biDq#vD+PRN^~3&EZ(^48qCp;F>gfI)%B6<~auosrG74%JaRDC~zK3g=%%Npa$*> zpyi8{c?zg`p6WN?^j`!j&%JeB77tKx&G(l`k6^!s^Qw40g0MF%K8)y9iaM@?vs!{^ z+;VhTp+`7(k9C%aUbd)yD+bw3#C=M)v`)h1fq)5{eJ45I+~m6Bx= zI3f)5O*1ka1g_76>e;PGt{G$Xa>-M`6=s;PvEh+o={-HAh;OuH*!$&(a^v^8=9YM{66e%S0~8!Ci2*I5K6AXYvY^c8Iplj5I<7|c=QvEm^7 zo;_Jz*JSY@VC8(1fw7dnDI_pu@0=zU0D0a!jS+CK-svDvg6g&URL4+#212Gj7BZmu zP!^A*N|geIyuV@S96M0{1J(q3jh^=KdW~i?%z^#vW)Bz1=Sp*T(-S?-Ec<;U$Qd6S=hij6rS$wf`c4zEl)@pj%$OxC}9- zDsman((oo{`vp{@Hpy&ww&e(?e4K?Z94zg#`eyQN-|`jq+jQ;LnZ1s<_5dp+6_C=p z0-Ssp)|DVi)-}&b!p*1b5IvH!enoIbJmiEDBdaJphO_bayg;;ZgCfP$NCI=WppfGKg9K9!A%l1+MJ~&rp$q^ z-hx=E5h!dY19aa35*n|p3j8KEJj8I#y={CId)jl{kmm!IuTPr4BSy+v26#}OkA%is zt9-wUrypSq>fA*sZ{da7yZdn|ll(DK7Bavt(nCUf4N^RNK_%hR?D(0~{gnA`8qD(m z@O&j3{wLzh`b}X#j@n6RysgT05LDTCnU=cmz7N${4?%ExbLU}jCp_x@J$e_;1HW`|rdB(MKHy*S~ys8QlRFAhhiWpYOXT zgV0Ym-f!Z}MNn2F|JEr?FnAvTOvE(MQ&A=wq%%IfxXsQ4wAwKup@@kF$BJu2t>cKI7}oLP?IQMcl{PRz%1nZ*h)gi@ ziwLo_xV@IRpnndC8ZAUdQF~3zh3{1< zp(0GgMTTM^=81n4wLhsj@r^1mI0EkiVsNP5g<@n;du`2uuT+V_6L=OA!!X*jL>wW8 zzKK{_ytKQQ5-R~>83>hWg_2FM{QG71%&*YX+m!4zI3J?FFk*P1B?ACc$ zVR$+B9wr96^&U}n>o}$`v{%nDVz67!ab>r9P+|4)@Pou)x9*e5Zf&O()&LLtG%;x3 zbtcAct>+{|*@k$`=g0uNb)E-d+ATT&sv-$vL&pU&z-}EEmEDFfDGaZ1`ekCUTm3I( zx1lQvYXZ}|N(^>u3oE+~UQ?MiMXSC}40db10pf4$7WZ!=|McRKn`DI1Ms7W3wEjCP zuV?VA?~n~f8;(3?w7z>P+va%C_s9mL4c!M}7;QoCgWIB1P3&4k7Z`jf4Y%%U>zzEq z-N^uJ86c7P*FtmH7Z@O}CEF`&@WrJ{+0)r{R7>=8xJFZR6AA&fuEv#jL zTHj8hsMVC{8;W3J_ikUBvjD?H|5ElAns>NZRmxty`lK9F2#T|ifdq7n9uit}Wb7F! z9+a}zEuxP`Oa**XXfG#TDs3-X!L1`AnVx|cWpVdvZ@B?tjQG5?9d|K}71q-B@V-`M3n5AjooedngZW_{QzTx&qb=VVy)1*qNO<|iYo{f3{ScvdUP0_S~>#; zF$L)gwfLSjzc^JiE@Q7)#x@Oci3j(Ym9#FZq*dXVK3uWxpQ^Io*U&1(7 zo0saL8gRtb%G#@Iq4^>^#g09N3&p2p?UkMlE&^||+7R8R+mF11kDqgTmLS@A|4^$b zWeTa$#bi1Jw{Vw*^Kvf}yUN;YRPg^oA!_qP^ixb&!LQUsN~ujq;`yvkWmlIZ%De7FkPH`1BhaEd*IvzY({`CZ5zcG~>TSa>_aC>>Rx zhH&QnFWZr={yWgL?wL3)+9($;czxbdr&fbzed^#D!Il3}9*^6$8+`d5H+*`@6g+P0 zUeP$kj>{SMi8mOI>{pK;E_*1#9m0PiZE2YYHaByZxM?qeyrQXjlG?`TaxaP&It27_ ztAQ`Sn_{n|1&>Pm_`q{KzmNuoko^!6I6)z}DlW?+?GIm$vIQ+WiD=VzY+-;d-A_XM z0?GWR#IRI*<$|s=*fhnj`k;E>8KN+z4BuH$G2gm4&nvEK#b8+H$;FizZwOSex_!RG z_XF~AJ1#1=DsVNPi)7<6jOP-ln6Fs=67AFM>8b83h|c%YV++GW|0gFkr3B368t|B- zimf;9h%f5cQ!B!^J8v>={N!%r)*WF7-Uv?JaR<2C;Bh?y(p1Ety9mf{GD&EiP&)md zs9C{oDHytMC<4PzTP{&5!u9}Ej3R;$4KBQ;S|5>%im+NE@rr<(x8semDz?Ey1^|s{|gEUpKg#o^(`blWqR^_*Ys>r?Fue@BpooG}6Z-sF4vL+mk zj+KlsBi}esFkW3biOD9MsSd&+Pin9*fYec1RggQ}jafmtzRGw1wDTY!wRGkVa zpHghol~Ve1cg;>3AA| z5>T9C$|E;p> zVobA|!s3(OCRmalbNNmCy~y8e+)l z+eA=0p3R_Ql;y-xy|5VzhMnHu$Rz#FR#36Za^S>X%%fED_{buC&UR3Fn$mwaG=&kU zdncfLnzHRyno7Ya)U^kAjHax6Bg*e!6zbf^wDF3G?2jnF(+o!Q2XMn^{sd|2VbDPY z5-^_BNoZfv?*zoOs(70WVFwpm1%{Hg!vv+H0rqkZc#IajAwvtCRk^^l@mla) zGPJ;Hlgq#jYq$c^)WQ}9xH-*FLgOt1{;Q%*HE6+gO=+POjNzID>1M8jiqV4erqV(N zjNztaqMNw|Dpm^)bOTiA%Wy7tBp2OG1XP|D^m~Rqw1z$02b50}wg*ZR<=em>9s-Zi zgw-m(scujI%sJrhV_Jv|L>yYxFpfb04dWOL(p1Z!AqXVA29qG6C432LsJK`i zZ6t&@-(af}BZqY|&6O42glgl#yOG@oruLfqeK zb3x@P2HssN<^$Nud?5K0V_Rq_=0n)ZBH%HK zvEpJT=(NH|a2;+YjaN)$sn7v8`WVLX3t+=ImV-3aFz8nVxQ$yUp>e)kUm+UT#%xds zpL^q>R{a!K;UOqJ$0|@UY6#-9Z`#Lau!=QglAdENs8}@w)+sf74y#y4F6lYegUV9_ z{5I48&#@8F`E=mhZ0H~p#<2x>j1Ih8se|;C;5MdxN?bz%p(C zk5P;l>uqow75c($+-A~v#dsp($W!+8{(-x|4CA;D($v8g1`@u5Ns!R2^bonAN~jU6 z<-N}Mo&fL94`b4-Wgy{uSPBVkAkz3Afl8KX+SPyg6*Jk)0ryl^4K&Q5EoVqhx02Ad zZ-E&N1XZGK8%tlzo0@OegYJpozwD{6(|`s8kH27TC}Pag&tiZtylxU&2b9EZV~QS~ zo45GdI8Mek{GMpFN>8nf_b%6PCcwnGYXpesc{0|K_ryl9Sn$r}9BHsPM^RGj#{iMh zBD)@1p~DU&-!lr25l&#W^|8Q;Ht3%H9S-AwL5)MOWQIHei5G%&%7)%TC}!a->zpYnXK+nWV>=1S)ziLSV9FsfBs9$YioecQXalV+T#Z=Tlm1)H^(l zth|>cJRMYty0{3WXBT|U(US+y?3jT#Q@KYO;3{K?g!VSlgl3Af^)YYdokc~+Wyaua zipjUPXKsv`oeU)4B`!chu9yW};)4cQcXML~2x9u<<;}m~aWV53#fVwU0B;!dk5fUcoB=M`c}ZwJkkY%9DO(sRMWu%J64fXDVx*y|E@U8~ z8Vrzx))5o3p5@~8hW4h_$E+~;IQ27&0gg%CB(#cOfLbZ0H^iiXZPh)|Xz9q*3K*2S zRs$`;UAY$As)RecFlS<2E3P(#F*(-}liv(SvB-L1X=G0?@9+XE{&L5TdC9`KXcdsA zZx%fo*;A{Awtz*xgYX_M{>)33FaQm16DJyBDj(xbs}FpfU$Slok@O|za=K?{V%rl| zEKr)j4sv4VcL&)t*wpW$aAPj;?2;mqUWCQ$B31~*Zt+fIdmYW^7yoIDDung|C?VHA zp67j0A3~sazgP&YMeqQy(wNCKE?nYH0Zb;cZvY?*UJaV$&s;RjKyeO=M~&?%Pq`17 zOy+{8xiAT5?I&2U<3BNG@E;a>6MLPfTu1Zsn{!1Nr1}Ude%~?4uQ^YMRZZ;aN!}BH z3VqzR10K0INUXfL)5Kn;+N4te%oeebfdq^~J(B1G;!R;9K$#08u^}vpCV!011JVIvp-q= z;*A)-Tn4zA+jf(DI^@}IiCy5Ud+Ih~Vh(RKca^*i9_t-)?}AdT5mDtCd!>Tj$URZ* zL%m{C$6Y`LvC9D;D3OejP)J%sfdcPALWG!0Cqy+ykB|#sqBs2>Rk4l(7B3{Bj4K;rU2|i*{f-grYLbKuQ`{wpa4M#== z%p3)hZ9!va&OnmQc-pNXs~tw*-qB)E3oe-04OTfn&H(#;4+(kxf@h34{v5p+PE39Q zqZf4b?(qQgbtE<+?EkQ*RV#spA()nUWMjc2^FTdbaQ^~TaP*|%h2Y3n@Ewa0XBPY@1KipZ zBBAM!8d@Tr_y;uZUCM&vO=1~k#FrXfoK$xTjB+^>vebcJLB*9CJ)A6cDlBg$*;s17 z2h`)GcCA*WX2-n-9QjH;a~j^;UEA)9J;(I&3ENprY$Do0;qgQ0d%q*jEMv}2 z1UQ&*kkA~E;n*cCEwP}1UQw126Q#PJV&cmf+N;WFfyL}&T9(naA5>f!g9nsytHECW zARCKm{S(yV%0(|JZMiy(CIF6n1>biVac05KFu=X}VG{C$-0%_6@)w1J)cxKx;gJ(;K-+Nba+xb zPr+uwgySFUnCpl$wKIzW_JeK`+H7R%z9AmIgnFT$lXb?JX5KAwq0X+`s?O-uh*d(z zI3q#~)pp(m5v?|QEoqqzU?=w}nor%43o5SK=&fY68^U%Tl8x2YAAx$j+99h*$iN(e zZD8(Wbq@ZND?d>A0CTj~!NlV$eRv4s%t~KoKz=oE6yZ{Db$kwwztMA8 z^6S#Cd)D)KaKprm413iI;o-oOdS>^mANzLX%gGgQ@5O~w;S77S78)rMUbd$c^o}-S zaSBPH>d8i*gDxkiLr97LN7t9YH(8|rH)(+$&;o^Wlq2OVO1ZqiU0e$kMQ)0?yI#LS z3v`8+rJU}%4dn`V-f&Dn#DE|HK?8zDKn;i*pkP4I2q@vw$QiIoK#u?SJClU8`p-wp z^UU*|ndhB(=9zitoufx~Zl9ipK3VED(`gBTi+Ugl?_zPfx0V{~SQ-k&@g#A=(L+m0 z^(>>t_aoY^A;@_|Y~Wtbql=;p}$@i;#n2;WwPXp@8Q^TuuBi5wgd zdVD*O5!)f7!y1qv3H|M7Kz#rzMOjVXD5G(Tg*h6op85#l#PJ1L*x8Gs#(af)r|{%x zZBzWaAgMNLba4p+;qejJP&DhU;arSQA*qQ?S`!M!X5meB0*cRx&4az+gYZJ)-3_r^ z7PLnio8GaPvh?Pjy%ca{^f?o#Y-D!qtzZIZ$L=qQiv{79rlz;;m$GKrP-H)4c-wIu z01;(t@b`@0q6c(2NDM|p&O;!oSe)4-ahaSR_Yenba~uZo2WvBZjnMjH@C&AT?VpBs zAISB4x)>E%>g0s$KXH)-%idjl+i!?+AqBVIrVBAb#(oHE!j-#=t?@ zL;B#Y)bR@#IDD=XK|*`U)=P*HzCm;9we(bgiyPXt6Xq7|zf}V6B3mypMjReFw_d9I z2DoZNyWxOj_AX#Dgsv}E7`^ihyo2i&0xI<-*4wwmSI=n8>NxK}6zPe~_hfK`?zNx~ zD#2mAgL17rMwwfNuy9eVB*V!yI|+RQ^rQCaVn|=S8R$2f{d<9O!hPvh#HYd#@#9sHis}$>G3^LkuH(ZJsgvLlSGZT!#M>%16vo{|Nn42 zfO9V-@%K*$IPy7osX1KVIWlbT0TOy#s+k@50#xm>IJl|AkT+?J;o(tZiih*kTDKbl zIp6gJJR5)EX`cib{5}Y)We#i2)oZQ;qI57mK={fLSZ8t}PCCGDso_&`XfJO{VAokS zDK#6YPG9&6!Ze;`9*!i(K_jqm8Q(&-9%e=?c<8#940{(33H?72QytW? zS7a}``TG!{O>MLaFlvS04>>GtO`9jzhm^841ksZ4Iv`RG^X*?_aLk?yQY-d9_ z+c^+PS%w~Y`G($V5&Et32x95zF+iFBBY~(~D+zt;3{XFTYKZe3XEiSMlCE@w?Kq6a zR1<dtiej@UhQQR-iOR|tv4B7pG3Z+Og(nlfI6FgAzBXBq<_ zu|;tLx45>3O?a<~X+yD}BzO&iYJ(>h@a~)7^(rV&h1dmD>p%qri8)gWC*&54mqXvc zuT`M#8{+m*?Xmu@TM*QU!}L0p&OS<(Uq^huGl}+weg%^X#z+-*+(Ag#AC!~fM@BCR zeOI_T@7+7X_^kGz-eDA*pG9BdnRXYZlQ}HB&U7N$&Bo~nlZl}7+eJox{2-yfh?;lL z5O<%&`;~3hUD0XM!Ul~wZ!(+dRPIcybMA^f$RFd>$y~@Qe@&Z@kZ>+*$#8>|gM|KK z3s4KhvSC`ASkt0VF6htfW=N~#Vzh*EL6>G*40)woZY@DbIG6cL!N?gD68ej9de&v) ziRZNTu>ldvg;OZYA+3^&e}&4W6#boPCFGTIIr9cW!o^-eh9CNjt3bpTMBZ(UZ-TF# zUs&>r;olRnthpq#-BaYKKv-DYqhxq^hL4244Sbhx<6ZIU z)P?DB&Q0NLI4uVziEDnmn@J!W$9v2seXz%YfGT-x+={Spx$hz)59lDFZ!!cbz7MKS z?$g;rda9vq_{_DWJw?2yk&fiO5Hd>igQZ)dyelCHf*S`n@QNA<21S40m zl8FBybU`8v&ka7UCr+=zZqj_ipxi!&%t<(Pg&hwT)$fZ+<2D)k0MmY^aXgZS>A;_) zAzpZ1OBn1che&lna3lQ1%D?<>mu)-*A&x5Ij?d#?ftJq?Z7-4Ggl>>T{Km+MOF@tL z;CXzC^BfVUp69UiYsjmZ!Tw{Rl=QIUlVo&o27VIyzoRMnzY(2Yz|afb+Vd}H>BD?p zNMaxEhPQj)cOV9Y&Hf>6i15mwWY)eV)_-9ja#m(Hv7Q z1QFJu&wv2~3ACG)vS>_hGl4J)w-yC_DyM&+0q7HKiw$P1L|DZheFpR!_!KI6y#%&s0jsnV z2xBpA01-C$+=2c2^kTOtaT$1%HNHa}EXBA9MA$S3_23BAyIH~>#5-+pGhwik;JYB| zhn{L^b`LyJ?`H?}q^_u7hm6p=HB8gN2(XpF77!5|&FSAWyXVt6sN(k}v?bnx{qGYB zL-B6|5q_rL+5LJlP4t&Eq!#GRd>;@9L-BnGBK%DKF-?@s{!?V?(HnSnQC14#V-R7lgX;b4+rg~4^MkYA{DC4~lGys)9Luk$1sU`-o zIX#;53lNF9xbX_pxj2Cx)#_F-ZY^=R34?EQ>;n41_;$9RBp_%wUD*j<1r ze&Zn}A{#^aPv z25|yJ>|>8ThPpW^YLC(y)~N@bzDH(06_mWqw{s>B`Pi3h&_iQA*JRJN-&Z-{q$i#q0f9N*_k~UQ|;0 zs*9A;S6!0Qhfum#l#~wY3Z?LS?yFMT1;u+!N$HiYQ3@C8x-O-iQMMIIieB7VK`A`3 z^H(YDghIU`r48tMZcqxB?g*0ThSJ1hy3tyCJ^L*Npm^=Sljw?a#M>PTq5+-F9fqNP zY}supQ(g&9C*9B6)uao}cXAPn>YD~LcncwPsQ_|(KPIQXQfqySb8Z%$Mrw)QuOLS4F7fr!oS z`xMI9Msa#WmyI%xiB^NCHmrE+hys-MTQV|lYI43s02}&R5DCxaO)40PFI@nc-&Q%m zAvoS9h|PRGh}i62*(mM}QrxTqblE^LjM%;rMEp~E<3|=2jLAo-Z<3g%9ih-BV%XR> zgQ$^HR8m}2_-~Z`yGj+9nDsqE*xVgVX5jFG@uLe0$D%H_-~;IYv(fp1VqheIgTEVB&8+5Nt?%N=^1_(LCDy@8$>crPcJE$a3ALSOcqc&+KcZq zBI|(I3!<7_V~UFVLIMnEZQd^ks0-pt5Q$HXFPIADh-i5V$RLZ2TfhR?H} zVhTO-#^g_ym)-j$gkS#5rwM`MGoJwwpEHSF99Kd6&q@rx{F%-X1NUb-529wDB7$(w zN8t!qo$p7LT~8?X6LIi&Mn8xe@~*oHP}uvkm^KdmMet|JGoa!H5OKMEa{8erE-78m zas!trhhqy|1`(e-wP?cVyeZJdeN|$bJPoz35(5|J4}hrtbn)mS){X1B(xML(x=uuE z5Wj$^F?2F62PDM#t4ibbOa@Wp94KXBH+k8H$fylgE?5t z=8evqh$puHE@1{J@BW=II5hWd5Q(|?>^*uix@Xj~?XE;M?hobe5{1U(x(6b5&>%dk zb=owcdj*?02SBrF(;$aCbC!XKeI^HC<{2URK%e_WRT52~gG$SYpyv@Fs>4tw73QHftO}CxcPM2gq#KCkAXu_R`6I^Xjhuigc|D}e zKcU#`gyHjeU?qqe&%wfr$B#sPtO5ppv%&Mw>rIFf#uknkUrZm5YFMp=ZC-#{tC;{C zxNi-J6p5M)R2M@>0|(d6wF+x^5&Eqq7LMGz4n+0AfDC4>tOuw3ZnKx5o*isWTuVAK z54SKI3i)BczL5}|b2MmCYVyla?;Y^88{1~_z(jn%a&2ZnDRg@mL}F-(g8ZmpbuezM z$Sa(i+7hMYBu}Vw3y4}+Ymt{fg1gmaPUiQ;8%VI3I* zof4dk;64|gPr;hiN;g-sS=AAAWInoYw%F^ZxDy436~LD`JG==m|oNS zH6`c)y+>gg(=;6S`i)8w9>ntvg>^xED=tlen)dIMtQd9v9cA!t?&G4vRP4L4om4VB zvFjvdT|j&<{yP;@T-H-c1`V92D5C@Oi33xyY1n*5$q?i?Lm5VZjuis~`;7z59zTuWI#b4MD$+FAB7De?X#BCZig!5giBO`ZV#cG88b*NM-@2 z!5tVYD69wKR}f8}>er)}_;;C>Dw6+;Nh$AdDiw4d!QTjk!w=p-c~94}^q!k4l~+-# zHz|A=#4Ql*kjh|{%Dex?R&@7mmCAph)@=f7fVeYFT>LL4=Un%sF!{fz<9igMul5sbv2{CC{YnF%YxF;n$#<-L&j~aDZ+T z!_ivYb3jy=K4mbLv-ZVUf?_EmJ=6vs!iH=k8<=(kPMO%Ox-9jN6op)=Q zc#SR6u}ujVqDr?>h$iOQUM9+?qM6%2RJtrey?#g`EZglAg=I+9wnNI&%&6KOl)eSsE(*V*+8=&QF$2*E;Co5h+TupjKTJ!K@v-K~yzs(`T@(b#TnOe0asOc}o$?0f)aE~(YrKr<=j0g+0?iZOec&gR`C0m9n zEvF2&Wj-kWJp)z^_sDp41#0vw%3xY14~R^WQL3d0-wYlGcvvN1Ma>=|2$o~~S~Qu7 zV)Y(XvgN4Qqm)78;4$&9nW%j@N~zQeRP48u!EORxv3(|-5*($Jy^fkaPFZIVCq&Iz z@Jeu$QnnIx`#oj<2JwT)pT#=%DcKvSS|4R_klxc`%Pdy$StVPAnmtPy9Hi%*xHk*B zz){LH-$cd!NEsZY`zP_tZ0G_1A6#I8Eq3PbUsCJu)YOi$UN=ASm&bYa#+`RGir1Z zg{)dLh&VO0b66NTUGG^e4$XrjurF1Ky@#4yN<7Tcy-cLcM~`l^N?8jBYSKy>oQrEY zh?=?2We>|SWHL!~Y1Y?O8e34SuM>wnoh!wh`RFOktCVajYIPN5sCvhn;_!SpchhPq z%X}XdxtcQ6hJ6i)y17G#;yllZMZEEGD8I@e7voxq?ywDYyO!wcAl89sn2T=BkolBc zjba#tleNa;x+{4}4cw$Gs_js6J>#JCt#+||0o+MogOYuKYTig$JcxJ1)df64Vv~}6 zh+5uESptZ6#orcU9@h7sk~yK0gR(>rTg0q|XjtB@O7;;dc`Ic}Al?^WFJ!O0UCDN! zlDAWaadO}Tk+}$^1UI>5vDPsCV^p$}vL``&1fp8syvccmDE6JAjv14NpP;ID5&-w( z+XX`37j548iIRSby8eVxICSr)Qi_(~*ew%pvKtL~H>KGi_JF89q<9Qg)1c7zGJbjk z_g;$80NtO1i0hU02s|0QBePEb3|f3i`GX+bAgVo^)ujsnaFGNw*$YMX696-D9sp5& z=#Z?(I>9>ODEWAezko6aiRc015QwInoSQu zpVLJ20dWRIjs68C#U<1eepEuff=1^E=?mgKA-yO53kPLSlp{gKwPAJXhGfx6#Qi=HynXNmnk0v;tGgF%=VN_EE!$M57&->L^b&u zIt7Rt4B{Gy>b>y=wE)9U`!6b=qfqG=B8Gsd01@}k;^MKWfZtR;$Dq=0ln(`Q14N~K z;9H?>dRymBLY{+qw?L$3kH8gx6ADLQJ>H1X9q}% zKQzzqbn$r3nw##0q`e?bu^VTgatpGC7QBLLz+iMK7K#4{k~+5OkkrV@8pa!1Q2{fQ zY#U^Ct+ODD?_Y@Z9>si5hOdE~0F}B&3@60Lt1-S!S)EhTzzo+*}mwVg)}0cxqq?!V~%z0L|G+6zVc@4G~iP zf`T67i;G`DE>PWtaV8(D*D^e?Zv~{)2J#SZ6e7l%@_`{~U-XOskXPu`zb;Xe@0-&8|_B3P@7jZ!y>GiR1G^&uv?$q@9FTr;h7wNNe;Q zk0tl~r~}U_)BG1?b)6d^iyu-v;+4tr;83_uDa2m4I*lEhAgrBRIEJ5D3{R;;xJyur z?<$a=soURU>Z}fIMnE-gk+PN-V(?STL+-^?*TK}bGAGP^q6Khz2@X}}^r97yX59{9 zwV}o1^7yv%fs!nRq@mdfNirP31Vg{VQKKiYGeNz6q#)k_l4{xsNP>LzR~F&hC8e2H zqIKZ%SmP%^)`9{s+TNUM;X*R+rxKlUH5y$L=%5Se>bN+s!0;&Qe~-#?-g2!@THrH? zYW66|gFdeq`V@_T<-0#ufc*sczaU^3wx9GZ#yg`_+T|voT|?hK$da?iu-O>!T@D)| zP#(?$D*7`k@YLRNLUIjl47r%8D8YrnBSzENhExEgk>@KwQik=zT9%jl-02R6G2N?Wnl6LTgvobqs>|T%1og8i!HR&8k?vUf1d*JG~Ib z_31SP9@>0d3H}2?BgYA5`3xGpEJ4+?)4?jt$H3IF{{T#lp~d65+J??m$!>7&nxDxXF>%Z|-r_;usxXs*X>9%pnA(^Cdj&J?^1%yn zK{vgt0_|WzrVC7{SK%nQ$uWk=jI!^d!rTU?uJJN3@qLPh74oEex>qH9>J;>}a8HRf%juBDMU#LKfSr$KUBwReXJP zd@k(v1sNYx!1+^)kdO10ir-`vl<@veC3;{o9oJH!T{!M2;d2yv?o!w@@0EhdC=1j( zPG4GsRTj8D<-Ue3kb`^LOaOE7x-=qh0yYGm`~Zhp)$E>ek=Be8}yGi1rxMWe9jG8evmvMl?crXaO!P}sUy7;JbC z3oKEA0~lz=@(LSY&T-rl%Ajqn=u96#rl#dcxMp_A=rM4xa^4svze1(pK?j6R zgI~_-SI8Yn-ZzxA=4v$N;3`JXoj4XBHp0<8HU;PlK%>BF08-$83s4BT1(*pbE}}A?7Xjk5iK-54M zFjvSNo20B`z34~nj7Rls2Cm)!cntZ4&d?u|vxQ^XQK9VLW2AO<-43eKyZ>V$&t==H zGTMub8oJ(xFgbTJc8%d#!rsZcT|uh7g?8-x0Fb1ou{;;A;u8RbQ8<;nC**YEmi1e78Vz@$FNH^*}T<9snYF z2r7?7g(54Vuk@BHh@X()K|->}LA3%y$g!ZXan{m0ygCLv;;-xQs^vbSq7u}tw)2jlnFp~E>M(UB1V;J~!s3|#4D0%z0 z5y^8>{OxVzWXIV_F!knWQumvCC%jI$Pa%Q0p*gu2x7tptn0Cah?K%TN^_>3MPxXOc zx1N)tR+-W9yCA;vJYWeu3Pxiwpxjw#{z)a$bUj*v!w+fA>=7dhN=m}zWV)aLF91;2 zeh~nE(kdP&I~?O>B@_@gv|WKP`RTkOcuO?z(DMbaDu|cyt=AZTDDEf4#z0g;;JOl~ z+R;kQ6%Zy28edGy9G8uH#z9Fa1u+oPx~3b9+NVcfL;pU#@btc*63&G%#dr(CYJGj)xE41}Y61@Dz1^o6gIRazviHD#4@;TAkRyy_ur<1~?t}G_iXl zbwFq%f7vWJg76T|fLbtQ<1GnpmY8-AMQ7NZFMl(EPtN7K%aH|B!oI~hTfrZWhCczg z*F?CqPXjkl^jFs|W6KpaNZp8P_RIsMdiL0oyzy}M_617R4wTBi@!~wnB!-40;xCjQan4orbol78(r(@3^KLL&hzE);d?;Sj@LqM1^XmsHi zj8Y2jTf}mO83v5rzCskfgQ*bXN*UPlFVPQ`gNL%c!5n0^d0g=mT%}^4WNfQVTzv

yenQHZoeZ6cajW0mHJ8OIg;>i5q97n*zBEBhTloOB%~7F4;e}P-)60`im>&gs0e$>aN)U! zgw)2fLq^yXjxccJu22MhHSAp=BbP>!(BHsRf%{`nHHQ}b-Oy`TpV0by(g#N}qKz#wK9wU##v@r}_#*J6&zfEr8fHocM`v3}Q zQ+5D!SeqqeID={ zr^2`zSZPj%Yl-|M^smxx@wsk`)~3atGf}vsWN08h5_;Yc<~u7=w`#32cbt#Hm6PFT zX)lTR8ouy`0`HIF<*g{Qt$y*JtvCe8<7YZNXunfzxGhZzjUyQbAy{05>;$dCam;jP@UI&qqiM!(q zM-{rHG$SGKVnYgwMV+RzwX*yvj8Pg0937I3X6QD%iuI-yCL0r{t zoJ9}{$v7K?JYH@B7MoyqnkY}DuEE$aN&>CWrxAuhr_UnX+wsZDxkSn8 zL7gR(jRdh&)ck;7t%Z`+hZcgeQ6Q{h&y+ zHf4CJv#%EmKVtyET|0{1qLD7h*>LND8@okfF>Nkf`Y-gMqkvPT=#9=44wR%59xY|Tgy|QoQK#Ria z9ftME<(~SW6I{*AN+xq;2f}3c3!6GehM%bdB;pGqnFV$dHKhXfqCwE_EEBOh1G6`a}Gwn z>+JXpY*@8&GIEU-34L|A1@B%^X(^EjDMOyp&+*0VSaG`Jf;6rk_kfWO$MYqKns`~t z$I@(^_aW~a#M{XZOhRKI;oe6adP4Vp5H%v(;n4vBlAi7=ryRMu4uXg;DHw+@CwzlN zufsGNKLFeOiWqnorw2qF??#4I;9Ujs<``UTIYK!axZ`UO2_*%i#$x3gO9UMbK?V#a zHXI8jV*dt2;{7uwVFGxA0V)F{2%9&Ql#^gPpcqR+IRfGFM= zsYL5Z@HM%8I4g8z0xBBcJ$J%9YpRzM~CP^O(HElg|F3EG|^ z0DC2oBQ}cT?gd!tS&_91YcQvsgRF*2WeSzggN+}Dqf79LI}CO9qbjW~*m?aUM9eSv z6NtEBT{=93>iSs~1juVYGo_IF(DZ^t;Z`uz5x$T@>xK_Qu}e$^W$wQWLf;iLh%S61 zg|yKl(CR9saQwaih}g~)JMm?dVvyeJ6eocAh2kz0JMeWB;#_=)@%&0L+J)ygigAhs z`xlVX`2Q*=sbXT9hXxg0p%;aGB==1aNhM?R#*7Kun(g=5!t=4#xVh_hf}Vz+w+R}P zH-1#aAgy;LsDa^e=y{j8J|OOaNE|)!KFmB#Z21I+@E52%%>)!$k)sSmrNb;tGfbkx zE^I#dE7YD5g4t(+NK)r;gocmC*-S0Hsckkf(B5WZQvIZ2L**F&L403DhK46#?{kSV zfS7k5)k|*hLsygWsh0kLc>yHyN_O)?Q1zas>H~-W3qG^NkW<7jl&~28B9k(y=aHpJ z1F*`L)iV}^h1-7x8GZ>fE(RgDGa8qGYRJPY?z@1lop97h$WM8fB7=MOMQMhfFfuUG zPJ+uoM73X!HH0ed1tS9^TX|qPh)@f5zYbcut2T63C&}t^@BorPh<_zQDiytJRXEB^ z(!-JES2Uj_5XJWI#uD5YLaZko{Peo_Fi%j!m(di4VaeR?Hl-O+-fqh!5SknfRNcl!f zPg%1uD#EsnV)Jf%pmn_?27jStq;7&N{L(gNVjeC4+$`evXqk=84oGCtbnk#c$6B&- zXRSj#vqyWlndyDX^%(kgZv**Cvb=HIPNIz%RJzC@?p|6LpJm^MfZ9VQ;>Ebq;S+v_ zhmVXH4>2~k;|0I*gdcwXN8-iL@GRCH z;^dc_p^bM3gyDygZ=lzAM!{$70@FNIl@-?dVyI&NSbXf(T4s1Yt{U^gCs8qPetUmo9rN-$!@;1)+elwhI&%AeUCicuH!Qh~*ad$E$n_?cM0S8H1D_}(bt zB{I$0NJSD}r5?f0VX58M&&rB(egR4wJS#2b$d^%3&V4Bcf3CHv8E_-8X}^h3VTzbG zXjY?Ej(rHJ6?*MP4T8dn#rvb;p4=}!VO;-#sJMgI&uZMV{7<6pIT#i7=t1$|7hH~a zh}L4LXZs4ma0yFu+2Ij0ztB1)dJjX=ut#n$gU}UN(pp)MfKLgjH5PO1JZuZCkioGX z$D%LW`n9<6h1U76o}&n=ojdF)!{7V&GvpVKn8>aZb#n~iwd4S{W67jZ4^CnIZ~O*< ztbZ2ru5U#Cm(b4rt(f~I3VF?UQNnFxnkC6Xt|5)VbzGWBPvZ$l!Ve)OD^7+Ya{tmM zGF&9&BvGejOKQ$T8uBJ|AJ((?BnZA2e{*ZiA2*)@08ON>yd5fgEm80smPDD=AcVJ_LUVO=}4m_Eom?B5|MAtu*)(0#wti z1^IkG<>(2mBx=3%`18*{UV@kOg2!Kck)12Se5vjp3-FAK1mi`>Od|HBzqA5*iSc?5 z95VE2>|mCMxWU~pP#(^VDF-}0SE^sQjIe46p~tv=Ssd7h$1q)04##~peT$2* z@OV6SIgh|MVoVIv%3$+1qhg%ADFz(ST6Xf^LSV!GIYYC14;(Pmz$4ZwIiWqbqaq!> zZ4#>wXf3+>?jW?*Qv;sG?Ec8&Q2MsJ2n_qHLWJY`;d@cB%kP=Q?})AU8b$MR3}LpG z%~8cr8+E>yOp|}18gwFK{j5}+Ri8Hwr955yt6Xc-);t5^+M(ux?_l_#DdihyMy0W9 zrueWN8MtSO6XlvA&NO>YtVsENW_`WQB#Z|!+QoZ?%Y+!QaxCSV!^oMS5pJEQARNrj zBcuz5Th93s0vZtWLPF9TI~G#jnR3S>DOVRl&(*~CgIfDUy9I$!ZQW1)k5%Ye%w%L+ zFIys7A3{vq(#kP?y=_>pxXVG5Exw@%dea0%VpqN@jsvmMyK>(S~r zHrWA+9b1UE>is0y&GX{elQ?9`qZvwF?;sE@IuW~2F@!iuw%R>R^B%)^ViOo#BG9|H zx|cXKUuWBl;F`)kPRT;jNIS@|c+wqZUe0&H%eJ49j1fdRSv~k{FRA3h{O*0m;_$=% z1M@}|^7X>|9)fGZGRNag#!&_yO9T_x!bD?rwiL5>a2eAR+33iP?bIZh?bCG z-;I#Q=tgB9+Qv^dT;;M`EBh=e{t`0j@jOr~Ek_-bW!sCOKRHp$$MCR|P|#bSMYCu*gM0bgs?v#ekKc}iY}S5E0VmgRn}wX1I44^bVFH{O!k%0pV6T_ron3kSf5 zOXoJ3^cwQPYvL4>j9AOM6z)BEL^zJJSsaZLo;xbOh49J1F$AU##inDr)so_g<41(O zx8oa#l0yy<|0oB$|J$fkPJSyMJEj@h`Mn6Nt43kt^Cm|P!S)=Ff*(CDjDWZGoj~B9 zsK4X;5V#i9FaKVAc?_qNdw&QS61G*)kn~%9;)ieWji3kq#ClH8k>k=-^BKgA9+z%B zt6;Aa<~|pKna)>%t@)9#_OY&?6r!EcUj?z^=a5zn&{=OH!^ukL&!YdgTGNrv3kbk+ zqTFXyMHFJ6D?j*{FCkpb+tjFoCKMB+=8Ixts-po@SmXIlS=~Ck_#oKJVD+szD7gxX zwvvXtR+8ZihW)DWe2XWy2gH?cwX_`LbqM}6?F0--D7>Gx?H8~z?OPR~m^Mpy{;#5s zS8E<;{S6(~7W1M8qr9N*n;wU(*Kb5cm=Ofi=>PB>{M1FK@Z`jzaTAA+!Kl3;AKt=z z6M#Rd)C;#lsnkTaIR5^ES8G;kx{bh8EJP{DdnG);33cjc?u773z*mrIkc`}VRL39u zGKY@F_c3`+EWD#}E}oT_fp)Ks7oAIFISm^mQ60@|G@s+hba3?VOz|9<9;nKgm=_Z9 z5LJ_O&w~7Zk|)W^?Fl3zN$!~=GLFLrPko2ac)qz}z;Rr-ZJP&3v; zB;#C8K%?iDSCLy@M*!`E#k7`8gGMMFRyTkA#)O^;*JJ#fy*R{byjz==N|sw$?W^XB z|C?p0Uub_5A&EmrgpW7Go8)SQFnQX+5;6_zA=z;9vRdVrPhQGlTLU@V61-d0@!_qv zqSBeaR;)a!HEU~KhrmBEzUyyCfoH52rvcWR?LzmxW*B^712chLpgr?Pqvr1|Jl{r$ zbOYJdgFsV@k9jF{?Z;3Bidly<5H~|u{VoIUva1&3zsI;J=n(erwdU2GTOe&DvR5ri z6~6Da_@3si2#C#_%t0neoEoQka3=5}|KPVB?*|m};IY8_jG!jrw#x`&@DEyQ@&_1R zktfFG6#ahC(o=mOAs`NSn!wAK7wYuz&F5wB6-8H%59usJWk0TZ)nl_ z(GHK6w1E5hL~Qv%Yu?-QDPZyK4Xo_3h zp3<6S%sq$*Y@|$hB^hq5wo4)p6Hy+q?-Yh_=*+I4;^LHJqNz{o*x2s{5@Qrz2aJff z$#NI7>9`o_(>iCIIT4j?1sNTl*m#n}aFoms!s$bDp3~wilXIVg0E41Xawo~k?G5Ke z`_o$2j6FXgAgtw4GW;a%lLWMMUJx@+YgvsQmzfM_Vx(4k$#Une=ZYvlt^Kv(#sHH+ zTWEsDvx|&wC5kg33}>_!jcva$HXBBFb~)R~>Qk>89J1 zvkk~xSCZAOMHSqhD|BbICh5j|1hA=ePe-;($m-rkmEW5yx}Mbx&jzQ>1Au;70_K;2 z)!9+yB+?Typ-uPyKA(}5+3vxtC;pc8zZXIO@5Kk&LAk&TMy(Ofe8x;h-3X;;ip^)W zrbGO*Dd)+S-5VnB+hlc{P|YR~4HKS!FzdztbZX!EHFl{l{-<;MZm%VD;6wZ7G9C|) z>E0CaD#+^Ig#pYHP0nd8yLlH-j(z}hcaUEqt8<_OA(48&C_8t0O)87dI=B#`CgR<; z^V7t_b6R|<$ILX6&`i45L>lMF>bBsSNYs4k`6pj|x)-z=HUQJi0S#d|en&P7F5}?l zcK2c?P!q38-7!?iK1o)$6>VIGM@9+$B?zxPhp}fFgJ?+A;8c$;6NdBHmF`^5^rZbX zLVD$7>72dG#o+T=^Tv*ql*@U-dXVoW%Yz0yE5+RNTH^xG8wjY?v+`)ryb6J#QEk=; zO#8eEKAiI|GIbt6F~%79CniRI5~d%AK&jFNS#2XLH)*U92|sFGOI>dvplVjewFr#L zYQ;M6;jA{1sndyh82Be923v8s)YWWVTZVctla8FqV@~zqH=!V1&o$# z?;*Tac9lZ*F*GXgTMqDHcQbzr7=5icG$>O13=?=?7=O~5B%8NUDDOT<<63v>`gcrG9srG_q5cY7_Fgi{%K^o+$)5q! zXm(t0@-uoC+hNfG|HfL6&JzRDEe-m?g*uNSh7R9T%-@25w~Lp3TlQMA^q~$(pa@LI z5mLVz0PK6lMB(``v5^XPPbsKnoM*xoZDdJUUJpBRh z9rio(#Gs2>70RpxCi9% zFy>jHk)2YB52Z>kCT2HunGGS_-^6iPq*Rc_KPc%rBH@yj-q$_{!qDR>iE(~7t?&S( zX{eOGfLaS6#JPA}LVy7X4oB$KT@8PN3q|oI?!z|=>m|H41vK&v#i2{MtHZoloVtW% z3;rc4Fy%4=P4JwTvE$Gu#9uDsNIUNem2m>CBazL8R>=oBh_>(sg|)=$(dN|BLuiDn zz~i7ZEP*K=Ig*Fqw9ZEj+axOHk4b!m5`2ron{_MzxWKxDmeQ6{zpnAevr*x!E^~$FIQLZ10KZ!MAh0hbVfs3F}s77;SG^ zp_2R#ZDG536Yx^Uc7Swf9405xwW6%ELkN8Ww!ag?8hj;_*13eN?t9b+iAvTP{8%AF z);a$ZB7cA~pMr=p^zViC9B_d~NdP0dUDfKAn)e_8XW5OwvU47E88Q<8X9}lsr8Z%+ z@L2d;Bd zzjJu1gAm5C6~Pd`5={d*NYw8^SbRq`EM6fB8#p4KLHL8duZdNS$9as2)_r|(5Sx==784Vg{@wI&?)>it{Pk*8GbzQkcj)6oN=>Ubv=pea?D1f{O!g z6IpK2bdrc0IVvCH1m_vhb$UP5t7lg3&|X=cI(5$K+^t(zSlziuWR8N@lI1RA$2oEF z8hohZyhypOJu=wzQv??e+)A?YRg*+Kw#!Wz(WP@|)anJ| zc{Vp2>_xHky4Lpb;H3zhgP{4B3CH`Cl|;Q!#gjS|73byQPyUFbV9%sAuO_vkTY3hb!?m87{Xm z{Q@FXiN0S!t4icoq6)Hn6*2w>B6fWKNV<7Kf?hOu zQy41nl?S_V22^N`N{{>w5XTm=oiJ!6!;_=}Bw|bWj_aG7sR#;rAK`)ftN4FK@yeK4ce)0>(V0|Aqwkwjtocj z0TN0__hyjybv#LyCxiH9ctl5+BLbt2N6GRa2pDhIe8A{y(B8@ z=-noZR5S@{Nu^sqfIO_|UNSrn(nBI-o*#j{ujnqaJRrd>!y}5?c12(bP;?tvT~}Bq zi3Gwrby4>DX#@yOn`dt#&ttcoBr0p_bSX_wQB%tv$itehC8PTbtdvB^Nkca=K~1}KdRUq1{s>TNI{yHXPryt`RMym5&ZY!2ee{*E zl^z5rtnQ3MjQS+3ltjo%Js|I^dz&mz5-=TRctl;_*AW=itspBGIUNN-bsz53O_}L8 zRm>E;+}a-`QCZ#Kw@TfIx`fp|@*O~7bDj63QLyd)ygh9lst==i&q z`Jm%`r3ib;>Yjnsl88h=H}3h75t@oOf7g;8wEHW?+C`S<1-MB>VsY&AvyAm93ii=Z zW!f%Qio1<04-#;Zh{VNff$Nfr+qHAIE}^*AE0yAIBCG2UdnXZzi;mHGReXO-Yx>B2 z8!}(36m>0Go=@N)5sF&S39a05T^zivwQX;zh(xH48dyn|6T)^9)oI&w7WQAkwGyXq zX^lj;J6f$$fm8F3j)Ny-Qx# zM<4Fm_0f@!b;?IC)43BCSXzGv0`s^yu%YvF_!2xMH#?_j#Q3S$mBty6!0iR?!YR{g zX53-QL(o)6B!p9j+UC0p#Faa^(8_-g5;@=5Jq|H$lhx&- zh)G6HC&}_;20w{prT;_SA94~EFNuV4<0rg~1+%Oq-y#Im z=9}U~9DO-;0M20P&W~+Qt&}N5)GpVU!avYDNGP=(O9+Xmy_c-+pLiS+N^83yB%<{$ zvbyJC{3I%C-4%wgLZPMB7%FWe&t-)!647eAUKgwH;ai#Y4aSIQxrwX}%ZQvLl$K^2 zArURtlGVKgV}7VZ-Ay8navB%-yntzY_* zr9o-X&Il1D=Wie${>e&0DH(W&kcg5qHW30}WG11M^uJ3;M9JG^d5MVWJrI?Zr0?6J z&`>giN>-59!R;8gf{0eq`2IrieDlS)K4=@GMAW=QRtIMjB%##wd`L({&2waR@F@Wj zN=^3;LLzFOB&!<*J0($BO+26LV}%Zv?K;s-)o)RA*p&;&`35gWONwPXTmY+myK`|Pi{{qOQo_q}(Sy+la zkFs-SG+99M#qScMO@&F52#vTf1ovHL)b@tZ%_QAnXU?lca9vn;_N(P&xn;;pg8ix- zFnR+jVlMVX=8chs>bTB`k4047OJ1&ZBB7qf{wp!k25CII$a2q-`&SxIx+tz@sa9$W zMnLTIwvpAn216$i>hr9>6BEg66IpIba*|ManeP%3vG=uPd9tg61R$s})3il^MC^Sf zSzW0S#!N~jW1K-uq?IlqtD6RUCh><>8l0ujC_NhH{Mkg8!FEZ&E=P6^o4?hB5EOl% zk`k=UlqDFL!^nLiPc>sMV^4<-lThmT=MxjL{M%%8Gw>)2KvXh((?YScx&`;;Evgiw zf~;;P%+*{qhEYREJx)AN$eNTlrZ7J%ZzK*wle&2=OeLb)C9=9%ux1iUHP2E)A_abq ztZp_+JU~j7xZ6rhq{L5>)tO+!Bvdl4*9nOf_))UDIj~g{e<*P0DuoUecsW_!T$n2f z7I@D{iF@Bf5IjNdM7jAwKGxRN2un32^2SB{!jrDJ*E#zzMedh8@>;ySzp1okw;^aK3nhWPr z68_FmtIr{gl|c8GA}bNG{cZ&5IUT!aKht?qt#Ua^rUAcLb2gbp-!h{kSLLaF8$KMY znP_PhYb#$Q_iZ%XagdQQX9j$BIT?1#4v#pIXi3kse~kcKst}K_Q)+fPJV%Xg&`lxV zTW#NnW=TMQ_6-9t&1Lp!s8ub5i61tv8(#|HHrSjAsB=AIfW>I+u{8 z6ST?jv3Vo1pgwBq9N`Tggk`CQ&02*MC9Ou4zfnHC>bu z;az-}36LN5nP~-C`Y7X-N)e9-z=lib5*hs>lv9wD&VX9`Mf|U(rAe2-FARWDxPJqY zCM`ZxV3Xu?$HZue=cknMTsK8I;tliNWWYq|a|=Ynp~YkIpFtkhQaE9%TocybFbShq z=WV9T5}g7Q;ZGS!Ow3}W>%9XhH=|>!%W-d!c%l}{*JBjV*RnKv&|YSaSeB|iCd1!S zM0HPx6qbcTu+0>2*0MCI<(j2}keJmZ+z4vyoP(g+Shk-(al{0CmNK;N^e~TCw#*ZE zk;lW1d64ttsA(YxwT=&S`TUvW-Q;TaH_%q;tSXpqf*ph7NsJAW^AE#Iv>9KS8PO_z8Eypr|V~6LVcM2>MEmABv zyVj~8*g#B3Bm43Q#80v%%Ym0$ip~u`s+UAX#}~k&O|PqX*jy}=wyliB^Q{zjQY;VX zjjI#{dyEOmvc4IC949I7_(8c|BBMVADo9Eu}K?fDQ03_4?CSV!5H$m*K`5hNAobk$gh+C2+tbRHLdfsFH>fE5@X(Hh5DPloKFRsdAU9=789emzU$dUhXz z68S9BqoXD6@`>*u(c8|7oAoSh4b~rlz=DbdI&XA|F){ptNS_g39iH`P@nn5iq2p(u z=<7|F#Hjj~w&}*J2!Kb8S0C<|kk!{i3|l~KsBcM64_*rcWM4D?Iss__1S-TSB$;FW z4I#<+P=kA|M&L$STq=$p+c>mnL8*+Pg>G;%;K?W`ymjeS-(;UJZCSxwU& zH_5Yzf}26qL7imv$jz@~%atPA zMMh&wlRCcbjKT#-PA90eSW(BaFg1l|1$r4EwfabmYiwzrvUMi{!UMFuJH@KTmZq_u zU7BzdVAQnn6G}tRyo(Iux=F+@kN8d7ZlO!Jq<41hCIDW@x)%frS+2&A4wIHkGf9I^ z6!O*0{H5rRXzd+eG61dJ;Rex&7nHwJFx4PeyN@vN3^Cla+M1Ui2i&4VQ%mDI?tK8( z7&mHM$L!o*sDk|>uc@VBgLKsQ0Z0<%Y6g7wWV16K6jzW-sqGLXm`7;|Q+Xe^4JTsp;K#bl8*GXDTU3X5daxKSO)y)wRI zUJ1 z^#UYeTiHuS-yi*uhgAF<5o57m29I{YrC_SS!(MGL(6#`jdilJG!w_Kog#lu4x}{#b zzk_#@r;Rx)K*-zda|=-46Zj&Sg_1`l{3fn8vouV70dU6+psK-qI3hINq@YP{`z@xC z1>3j{A}vk~uD&R>_RGwk0W`(nT}?dE+>-vF)o4LC)jEGTtZy1fxhii8-YEHtlYe7k zh9jzZx|n9L)YtoGh}WB=>o?5=I;vcKv&BAyKjfXuRH}2<9h)fl3p?&Yq!OgGIvxYp zyrJwC5E~~;Bjpu{0}NpG!@WLkurztluOUFG=UPlK6RWD;Sj6<<(hI5wS87GXQtvXL zqttUOSFsZiyRm%v;1HJs`EiJCUrA}S(qW%J9#S`@5vA9>2`+30+sN>6CYK~&!PYeh z=_DS?uyl!YzGaCO^Cp=yx_j0lR6i0v*t`xDd`ILG_|Q8=Obp(<9dAPzeT^|1_*}ba z*20n|zR$4K)7v+Q)h$r>{tW;|Zw@JYho}eiwoMA)+f)T`YqLsbUJE2+eNUmh?^Quv zcPP{uqRd+*s-0(R71V|I5kRL}zYf0gkdb>aw~1~o;fYM!36JbyLfw3TfIr<}R1-G( zA%yog7#W>lfT#S5)4A+7LWoU;E1N#qw{p?~~wy*Aq0G%VND{T%tB9+*o z!_Xnw19EXSE9&r5LgmXL(>qC42ao0_QLV$%1AFCwae=9oI}k?_j?Ehv+K1`d!e&kP)ZX8UuESkPFO>INA$vAtxtoX37ZeALR4o^t2_rF@hp@m%HNY%5E~ zUu}mFD9tK7R13SEOc>`^5XKkbOV#7D&scGoDWGV%H)qpf@nmaDQ@!(uc)7Kuaf;<= zlyL1)VS=#KaSVZfvLj~hw*+$mZ4zdK$gl&oO9IWg$j{wZT!3a{&qg0UP7AxbA zAW}vajvvc2ax^4Fr5ORl)dKI}pSx|;$S`^BW%ry|o8aa)2lq{!CeI#lQ zFD{;dJ-QRPSP^fN6$qok)zR3>$>{&Vkq)WqFJ+cK{@=gA_d9NYRZW5Ry_amA=kZkG ziM_{rV4*Ln<`!{sW|W@;c9GS;fb`s?;ztxs$fBK~tGGiTi$ylTZDi}b^v48Ct;WS6 z;1mpjvNw^{zl;>k(f*Z>T%`x|KsaR;A6b@_mhczOJa>AYGRENB$jShE2Wm!lA^tB_0o_aSBP3#?d|Vo z?1Nyu!WjfZqozuYeP}R9YiKZ*wo^?Rsyav+s_m5E|2*e?hZ%MM^ZAhP@_fJNyyu+v zZ0}hD!BrXXQjft^c>$hl9d)Vb1!n6zKmEw&4y$xzFQsDPp;TLUh;glz<}JKCpnmiO&&eYY$DL3_WRNu2#ke*~j5yU=sT*n8 z1v%!P2PEU0i+{JOsntfQTgO}kO;u`=+YLy@JcVzMs_hGHq-kHkt^=DYYT85^4+MlA zk>3YZ_(8y93|~TnDT_eElY+H{Y>re&jz(KeYRh|)oC;WC%bAnH`N5{^t!8`HCzi4Ngz zAXAI4Od#Cm|3TS12Wj1GoL-!fsh&=P6*k(FDCaeEM!S$qefjl4ooNnB#O0AZu5Jtx z!*&7Mm_A}gJEdV0ADKW3;4Q)@k2x2EToqgtj&_K=^=Dydr#vyl`}5!MQ-9I$5ePb; zOr-3q>k)nYGR9`3d|rlFYXe#5i?&EZ?#vN>D^Z$RC}d3v7#eZ zgq9J7BEhz6`mbVTdnG2qbZwD{>ZUYo=(+~&-wy}5a$Q_)uO#U_H$`l+@{-PQOQa_w z`Oo|=rY0*bbuPd7ELnL*=le^_BaYlzB&wufGS*wZC_=b8FKkr7dKVO@WosGkAq;g| z_Q1VG;v?cb_o2mfU0j4AUxn55gVJF3DWWVzX&vvL3K4dMq^Du4GM6XdBs?7aiDAo@ z>7qjirEOE!3?LfzezC8<|G;(~+qc(G;H{c+LJTc8>R9V6(YGTeo}y5}%>tH9ztbq% zcSLvI(Lt%Gv&>NeNFB!<0x;Te%$0!3eR{u$l%1yn(4Vo-BLLqy?DGl0o>vofan)@m zD)5cXwovTqs63%FE>ewI_R%T|Km#OQ=I{%p%kfyZ7mj3^z+aZL~|~ zr39cyW?lv&M%?J2)UDDjt!H0UOv_a_7_*oPh{6+?RtRG!1n*rb!k@xZ$Dp-bMO}9g z7ICZ-I+yI&lqk-9UT{0_)JQ<0U(jmzccXX+Q`4#2h`BoTCaTRNbK&^cT_u z$>Lut-slW>u63#oGb6rr)TM&3iWSs3*Q-IHh4ikc4!vdXXO9NeaX_bsK{+7yoHtdsa!* zxxN+Q&tZZy6&T;Qz_9e9`i3w*()&FH7;-vFLDUzPtqbdluFokIs(UElw21wj=nrUZ z_c;hE$+eJ}<+5EsHL*EjR{h2=!LJLPe3M;2fv7S8HzHsvE(wYHv&j305>vkiK+d0` zt1v2^XTMpzpzDk15wq$x?FpTOe3g?ABJa2ip6lDqS04ZqdI4xBU*+%vpuJ23nyzUP zitG)T4V;`bvEi10f8gt!@dhIjU(0#}3M~?-M1Mu(8ovSq%PsnS7y--gnqU7P1jXl? z|0LjHz-GS&xcL`|Kz2;O4Mv9rAgLx&RTe*psOb*)C{A>0b62lmz7r|rEr(p~qG@wO zfmZTmcro6Ewi2fJa^*DFh5KLwVcjC5dj%+iVKKrI55h7`0be&LENz~Q;kl}X^h9`qNIRjiB{S#fns))+ZD^V?fqkt=Ud^17R?b)Zt&=-66OC9j$&^`lS9NMGz zfPsT>*ppE_|Gd($rPru|y|W(y_k9RHFjxGS;GgCaj7Gter-BDQ#`Es^VlTiQ-SaiD zd%+{%AkSMCLdSPb_I(zL>Mx+>cPXOP3ra%d`ureeQNDN+%2?-O2p=<`Un9hV7nD{y zhgs}?LFpX1Y*~=;hGpVDJ=>RyMqQQm&6O3Jl3kxdGPO8y7|7JOo1k#66eGJUEuQwR zgjPL@2sd}Jzc$CB8MF6MKqj(3ECa?#qxed#7Ot*J;tNwh*02?T%_kF;z&b_G|H8s} z067~4$knb&GMb~jPr!yF3g%D5Q>n^Rx#o2cJi0&IO<~X;>6=#YOi9LS`lnzbCnAJE ztp4!=>MqlIiqm?fg`RimqBwBc(zsFRkX`vK$eFGjS1zV1^`16ve5|>X;t=x-pKIn- z5tmz^i+{X`=?;Sp!a6vlKWj4QsN^Rutt;uE>cNR&lgEw0tkRjyK|adJ)Z==P2hW2; zQLt2F!beEHEmUg!gJT*s*Y>S+jXrYh#CG_fCisrCP4msM*~M+b_ad4N-*yq%O^Iz` z+X3a@J9kHRYBp8yOr<+Te_-Em?1m6I$2nt&Pm`_PAJGhK#I9Mb>zFPWmV3T{CPw|t z*SC9M)Y%uuN~**9-Fr0eOtF$ZVt+UEliYj7*=~3bwm5>6#ST%cyAs#ZwI9OAya($K zYG9UwqJtu>J0_Q%#cE+TehFnrVP5l95PTb%NPdV8By&r?3XVh4I>F$4)Oy)r&03xb zby(DR32&hNh=dRHA9)n6lxT3qt&mJ)@X<8fhQ09GtC zdI_Ic3@4ZLP!eM-r(jWwqnb3_j5u&OPKTa|QgK>z?V+@aHh&9kWomJE1?t4_#D_hU z)^$wZLtK^O)Pdc4L*YF`=P|<7Ly3+tmIhq*!Q|8Um+=*&BQo(v@mCL}jm~gRwCsug zqT8dI4DG2zH};>0Nj*B8jL5&2mH9sVg->B~_`bjM4skDmnT?D97Vsgqj9((V+ zB%D2!C-vT6Ag%wXDYn!}TgPQlyO+|cv*${%?d~#gva^CBTtX&VPC25p!rzdz0sYZK zb>oJfUP|oC=4${1&M=d6ADy4ZaNxS;gJ*seli~D~i$oncYk;#vI<^15x7*6Y+p##+ z9e8##>MZhJ3?@kHhe6 z&F?|@ZDi`o&vkkk{jeq&MD*%DfQ9c5>7%vb&%gOt=GT14<6p>dL#*8|_V;F8|Ccz| zTfw<+e~IvymAVa;I~tn%TnovBH$ri{vsko!8GR31xeE7{OL)|rdm6ks;05;vnVN_?Iw^%@DvW#o^<;EdrivP`C><;Kr!9#P@3vW3 zzgaC*>oWkTme@Q?&*RQ{&%(`_bcVW{t;FqTULrD42rBZO)fB#GsnEO&)kL5TFS`N_{(KZodXhhKj_Ax=#fAP#+h@(&Ab5;_H|3%JZ*GSukZ;p>h?mn)*O+#S z5ot=Z+$(lX$tJ0s48L+3cY$ayr1=YS;+3EHNIW=G$haHokS~8X*O0OX{gHV;xhr7jk(|{9f_It4eGg|2_zULvigFue^%Y9KQV_4t)m#4v!Rr z3Os3Pv6v4xI`5ZaJ^scVIHW0AeV-=7(X8i?D1B9F_^ka11nLt&&tITTPe!{yWt|}} zzSOgex~ad7`UgX8+fmVO09S$@6@3P98qOvD4ZeZX1(TXXUhmtxpJoHF1(z5>8RIww zWvwBv59;0brH5Mcx8gWm*}oNK1JJ`VeJ`pH#G)?S_drJv>7fPwFl=L~NCiM=Efqrs zD!2&mM=^Pz(xm0ob1+~s$X+y=sGdO&^mf(=EQYpt#QuTUf_3}62Il*ccL7XYo}$C2 zXXDs4Yb-ufjmG4r`6oL1`{|)KF9tc7{xcm64t9X6aB&|d9GEUW#=(>LE_CG=%>(0G zP9{oi9N-4OmTlRqGF}!_1}QCCI4?sV(kHucMKg~@#@-^+qK=4uNl6gb1}T+v23$k| z!vsg!qlRaG)eQOKmHjHZyrwiv^G@NPdmS0R`!5a8E_ewU%mL!3=YLoxF+P3dm~<5Ea%j{FNFMh^mIrOP zNYowDH27$$fQ{=ebdQd_O!pvsIP!Wib^Uz^SUeelA~Ln*0X=#dei$agam}#o3PvOJJq$)=6 zfw&YJ#qobCF|o$E5UP*f0iFxU@&pI#ToL|;@=Ql-9t4ki_EH$+dFp)d0nhpK#n?CC z8SQ((b7OeUTL?BBAMVWyh2;&U`3SQD!K0qt6b5;|xd?o~^YnZ$wdKcOE&Z^46${AO zs6(SZ1#7%=vYdS~3eoyarC}GN8G=W{a#9!+)`g|u85UQ7+#(Zx1~vLJG38BEJci|B z<(o5q~B|3DCFOm%}MK^?mE*andd=^j@5_|H_G3S~PbSYUL3FIZA zO99&ZF{rAE{c-DWb~a5MYeP&GUSvH4QZ6h0g0Z&Xq_Y|xg zTSV$$rCzRiTL^Lk+3=t6q$G4t18Lt*MB>0vIU}>+8clt0t`w3DzlcX9p?d}fHan>3 zL|*Sb0Skilskq5j#>%++fhktPlAp2q_jyL zlm21OSiS^~(;+se$%bFUyFwx&nMJ_!4aiD~{gLyzu&{p@Vo^di{5qbIL_`Yn-R+hZ zJ=OQjb|%E2m~6NY&qyL7h1u@1m`f@mg*op$D^1?Q zF47NSf<8;I$u_d#H}QNVB2t*|j`JX^CZ=U$!)ZESWb;oUHXF!>|Ar?d5s|`tw_hYA z@l71UJqi}Nrb{6vg=E8T;WZ%7EyN=4IxYUhBa*<)STHdA z2uXZt^5iUr;kyxHG5sbj{CGP^M5Hj|O}~Mxme^}-<_LVt%!W~}_g08iIoa^P@RYyP zssl6M_y@>JiLXo=mJSPaErK8A7TNIIctpQ6VCEbC0$B|uA9s;u%Uc!Qw?mA|$cEp+ zQ|6M2=)nB<-ytRu7e`NE0=Vvmm|P?qUXI5k5z&G9@4E*wGI7wPF*su!E3UieywA7a zX)p)Ju#{~0UA!tJB08`Xc&C7@k~lCucND(E!^SZ!#O5^F@OyY#5)mC(3_R08R!V#k z_qD;mJ~PCiglzbIyeT9iI1vG|f~I9EEkNJVsD8F0;!Cf(o5 z8OtZJ=7pFPk=4l$&ZKYw8cdw?q{*Q4F%w3^#Ihj7WE)wX4xuaF{?=O6-|6 zZp1S%F)JY^8_4P+U}7f~(UE1qz6fNM#8+@d^k}v-3O0+SE6+sOmYBt=Hx=CRXcn&y zQsZkM>{c z??a#KU$5#XqLR||CpSREE|8r4Cc}kaJ`&Z3U}gq4>a=~5x9|8iQuK2Ad+FMQHS+g! zia0TWyLbK#4Zb98f{5F_}8a?6qstCvx^A8F6>*5}PuW_$SwY5ri)yQ>VkDc+R#s zizGgB&0Y=9p~1GjLO%kXX7hds)s8H`_iP}`io(8M3>cw2Rl$D193jT#FG$c~yP9nT zm$nvbZmI%bSS-FDp~Ssx`x3(cF|hMd_qT!FoI{$MXt*gL!(|!PL*n_7D703mcoze* zZeAx8AtSP>M}q9~$?*O{3yJ8EiQ>%nxbVU9wd%<8^`nk%mjpS=J4#12@otg`b)-&x znUATC+{Yeubn|$Sqv!o-Y;M5rV6^NQ(&>d1BCQAbx!201Dx!xN)R%;{TXY6n(RaV2R}{p2yjGtg{&Cz@v|O=8ZtH8|(4%gAsn>UWEw zSy)Ek|K2P-y_Lo<*v~){$j9N?IscZ|d!GD3GiF#9$aaSbP+#BiK}mz3Be;VaAQdqbk+T{G_Y$9 z!7(kc+Q~OJ6wf#unFm>5P+mGuYz8*MJAbL1c5ZdR6r?>(rgo}UL^#RTUeEQWh|oe2 zHCBlmW?uvZYCP>bX$e^_hjNpsl&tUhQg?iF7al;E+)%$RxT2iQuN%b08S94 zEe=I$F9nMg#|b%@`$v$@W#Hv(?3w~lfhX8jAd1E+F}aQv5I$zoZ`rCK@CGuq-wt}9 zu4A$$49Aq8-ST*IWlfNIA(@cEIE>5k(Ja`)KNf>>l!R7u)&}7V$l%(*hp$+(Y7<6f zq3~Ki5i4_)n3hwmK-AIew59p&+`#hpBr02~bkXR^SUwd$=3suREY1S=l*fU99&TJx-}z!?*={ z?%VWiT`D$jTG*f>mQotF3)8z;RCQ*D*i2+8k^Y?;(zQ!NV&Q>rw+J7PWll$m=rgf~ zcaH{g?9)KC;M$?O+kJrU5^J~*Y9QN}5)`X*eWkit?-Z@a<3q6Xuy}pE@VD;_IQU=sA-gFkyXzl91 z%*mOtL$2(R0Ix8r$7BmWrJBm3mQS@aVn)wG7#I ziy_BEU4zth3sQz|{ZkFS{&h&5e?l4*y3;SB-&2xDSZ+g(B~Uo8y`q|1PpFR;=7W`k z+CXd^cff?iX4zdx9+NCLU}~pMw*bjv!nB`jqS7GpH;8S9Woqn<)5Nj&u$0a^4T7ME zS*MHg_mmDg!%UI5_AdyH3m^;%(r5zz?2`ADrXp%G@&eTf-qKKg_va4rL(okXJUp6#rfh4Gd?FSWX7+JjmyN+&Cg zS~^xhBKHwLk8n~?lht7@Htrk-RiSx?9)-nj5&92sM2LGeWD(6X+90t%7QG>=?)n%a zj`duHV%!Hxy;jywAdnX`&>??Xfexz;uTE;^&~Tmj`~#&y^EIDBfK5%@v6{M#OfBqn z37dCSi!~;zmTeGMK2Tz7*f&6{`vN%ACK2@^mSY>Yh-dIuZ`clvdKp9&wWL+n%>QI! z?G%O&@g2;(ORW4*Y4xIQH_#DXyLM%*1`?+%af>pZVfq&g;Wlhcq&QGE6@kF%Q`uY{ zj6;S-D+qMEG@$LI2CUgydqg~j z>lEF#%K8SNiahlQ&r(E2_ge&76*nk3SmD_ZsoTivZb9K7#VxPqA3&&urmC8Lfu7>; z(Auf3nu<*fy`OrT8#(NyV&VU>nJN_<{||?`n9hn5|EI*)v7ICES)6y&wnGX}`Zu0m z@?UNWz5scp#D0SYc0>Qna1p|o_}h%xMJQMrEI)&&n3$H@2LS&i@y>shmYvOB2rDP1 z^?&81HzB@x8Ejo{e^VnD=)_^=UaIK|9aTWFE)#nYO`YS9;eo4E?K-^H3|lyln(gnWG9dbI9sG0K!e`adETRM9ry)n{}&bJyp@i zTXxWcym*NzyN#^Q01u8G%SFEii|Xr^?Gm|D@j94_#PX>qD#m?c-&8D8u{y-BQ#Z@l$VTK943W0744M8j!H(0^?xj|Z#ZuqM+5U7d$7k+Hd&qfPPJQN>VEn>;feq54j#p}y+;78-4XFNaZK zVFt~tIo`PMpnMRO6g4W2?`a{2Ty@o*_yLO+i0Aj>FT^vq6d2T2+%%k8LZ<5bTD5}= zx1EDP9#|s}k3gkgOi4xLZWyxPdI5~O!BbXtWNRW{wbKK*m#F)|Xe-XmM%Ltxas zkxh7thvO22bwA9`8Wyz8M%#UD_(lA82IdTxdBu_$O1oUsRr+HTyU0l#vi11hXD~^) zdT4OB;s4^Q6hyy_etGRRwt)wZAJLWr`KSxb2w=d?ivh7F`5L4c>m=}`yaF;cc@GDJ z<8NG8T&m#)q-q4@)l6i$0?u+n44tXef7@~sf@;B66_)=7Nko^b7$4-_B03+HJ&CGm zy$2=XDs)~h@B0G+xMdZD%`wye1Y2VX!Ys#1cm6{r|0Pb$M3L~6FBjKm;+PP_J%B3V z-dt4lc$w}m7qPRH7TC*Ffbd!m_$NxyRMB^q5?9YR4WdekywC=fxN`fDhnMzN6&xUz4o~UqHXcw2DQJ0+?@x6b~%Y{ zzPLUM2eh~r(7|LLkY`;8vcAw480(7mMx{bMrvia`CC~_LYs*B;E%~CiQHihTSWFd` zd*ag>&md}tbQ0o2s_X(Pwh?wS2zm6LX_@#8s=Bu2kf76s3y9JuWn|@`%3C3RfF{V$qyhR+B(X{A)xiG_}ly5TM`H>qF$sS}}UI(zups z9cB0`ix9k4VTLT%xE``fxXgQeCZrcX0~gUH3h8!>q;3l$Y}f!QDxF_9k}}5QgU$FP ztlLJqeGa+I@C4j}m0Cttw-pAi%~a@khYeq#i)3}%q3~@1g$+Qe7d>`}=Z>GKAC{dn zd^ApdLAGv#9<3}5)vi~d)3+1W-tEw0Z|Q`r50SQjJ9a(_=VC?vb^-3OLyK(Ue4Sps z2&rf{L~1!MA*nn341jKuRn_N9A2$YX-5v$PoM^&gy z5P9&mM|0MKOx=*tcCfc1~Z=mQAZv0>C?xLoHPbi zzyyi)ofa#BjWvBkEJ8PZ3!*X>VDfxZhfz_C8L*QelouYREqV=D9=| z+8NI;AQ1Antl?_Nyw(Np`eliYJPWM*GO-2_SHxTMFri3Yk7evS%6j5hI=9Ke6qD}2f-tZc-H#` zBFdyR>gYGD(45Ny9P*}s)!jineAB34cT?6x)2CBW4h8PfOgAa5+IwfJmb_pJ;&QUO zyP%9lP{D_upzwNTuMkHI7d6Pe2Y_KN09vcz&I2u{C<67CUVWyp`#}2VL94bUrUfL2 zzmF>Xv?RM=fm7;5l3Wt!BT+kj+{C2e=~(8I)VU*0p-LKtg5*@7!ITvyLBcAFU;53f z*{B8zC#5Vk-bEnrmStp(pNOW|u~>Y#P>E~kSpqRn)XL7DgcIE4eZ|NNyIFh=bx-%w zAhkA+3iY<-5J$+E6_ez55EqG{m~}`A#LT)X2sR|LxKmF4(4(<@4&|ef^>2FAB5>^)nnd&F2Nn+_duz*z zri^SAM0WaC064%fk*G2;eY|$Mhj+V}zX&I<8FxTlaT4E7wrF6`fo2a&Z5Z(g@`o;u z`wQ`pd?luNa}>BQ=(P`sA`p>1`{63~^zo>vhjY0F(r}OP09xC$7itFDZlv^&Mh!0F zn)oQ^JtDq+kG03XTxoCIA8PO1uSTIY3M5tGuY)-7SQps7D_t0hLtUU9thQK*i}id7 zc~nrW^@*=Pg^nM#_P(%KY4D`~E9fI+tnG(D%2Y{sBvm>hRh+^AybjxbX;;&C_<^16 zh}eUmo^l<5D3HX~qXB2wMJbcEqL#$Zq3WeFLa#?wIFE_QC0NOfok)0&hCPo%6O@t` z*Z*?!0t!8q6)*z=KaLZiE2iN9rZ-SrPKo(T@bLCi5QdLLMx6#xxovV1PQFNHTS|RQ z-xpEAeoF}E)NJ2{K#bpml_w9eKI5-I{vQ_B4Tb#-l+}Y071?t}gqxLygB(9VRTZjs zT3Iuc(ve!$LKC8ASn9`A^8A0xk09yj@Jvz^PHH`L>q!zbo&ScU7T=`9}R!}S+ook83NA(MgK8*8~l=-))KEGObA5O+by-VMg< z@A1e7%YBJz@)ja^pD5H14#P?rTy_rD6XArS zc2xC}Fa&X&OAt!6B@YDB0n1A=$4-!!`S|CF{>zoPDDwiS@a*bmc%Mmp2x&)?0%?Vo z&4;%{rYr(2yBg1jS45jmmiMX{7t@ks#P(?AJWIr3Sk^a~Aw@$!1|2p%lutp2i=l5r zSI@r;Iz(eq7EY>ERk#!S$pVf?SE#Cy4^_@p;w`AEdsjgf{xp(zjW9sa&+{<^C?)E^ zC8=#P2fOyQ5TdDxk@Kv4Nk7uw)G>$vm2y?$Cm;f2p7wm-t>Q9##<;9RU`*}$6hy`5 zDQ#1rwSFezS3v9hOw&3y1Zgdwi~i8&IzHF5j!i*Y^JXx3<72`Sw5lUli_p7>EtL$; zz9q=SwCzz7gJy!d!A2!bY}HPi5JyX)Rv_ zY5hf_AGPK^n%2BGNbB1tra+r(a%fu9{vfUQ0GNEJ%IFSs0;;K-D%T z{ojGN1$F!yqD()DBShIQK15;AqP+U2?=1hyizP! zq%^2KA2q{eU;@wPzbf8djiZarWe}>p0pB%{XaFBRZlI5}5H*%htX_@YfcJ*j4ZB>= zt^WniN2q^5iTiSRtq;bxICn6qZAaD|rGGLsIpQfJsrv|%NPbe)ve6C<*Sc`7+mNV7 zH)z=w_{#iW;C;|mkt;f!cUOwH*Pv$e-h~0zcsLBJV2KYo*XGoToC>gq0(rW}H1X*g z&UjA~ht?>qs=KFCp+~hnL)=-TG>P`kfS~dV`1R?P%Gy}GP>4?9Y&dbvgeoE_8xumV zS(=&GNLluWeD!9F|9+yxw9Nz5IUC{%fU@+>0bRFGuk?0(-WnL_Luyl-mOQcfW6YL0 z@_?y4B>Tg`9l3VYF;AR@SZ7`!%JH|QeF4-}sZQzelw8Jdf}lp9)bYau4v{wsqZ(h+ zra*^iqAfBmru!ISC{!v$TNkTgj2hgYt8TH0adDxd?`1GUj1M0e7-=Wq2U1z!K`hkb zK}Mn7w=4zCw6ZS)Q5{*;F8jk#?PQbfUncG%@Y?3(P*oX{Jqj_+Kq%${(RwYqAifo% z*IImnGOdKZ67^iaYFZ^GuH`KR7Fx#$+ghbUu5oq1MaNED7i(MtzCO}VpU7G5zyoV3 z==qr1$3?#Y(Ki%A%jlzPU|0)UX7wi^A_LJMpEHIRbl_E{xPB$k;S+o-@RO;|cs~71 zdeZPr#KXT%4E+Q>R@bM@=lERTr-0Bmsx9Ao(Dh^-U+ag0(;?+SJW&8PNXJOwglg*k zLC%Hq_X(otrMB9TL?rP?h$lLJ-i?riBb^PKKvdQuic&#VJBmFbOf+1lMCm*>(Rv-y z*S-!^C>#>xF$+r@Gi=el-4RC#do z4%p)hTdSQcX9T2=$w$mp<76$Ll9uX zrXl+Q_y!ji#-lgiR)<;L+%y5cOgz5f9hhH z(fSz#W^CR=f82_p!)I7*5f6K(7jpCfb0$2i?>jK5J9EW?fdljjji7g2p#x;5<0=Sr zstLq-X&5A!F>nB^$rFItee;FcnHBiD4Rus@>FzzYv6%cbl zR2-NiC!WzJF~DX|0^ylQ1WLMRK8TvBlkkCa?8Gc>>e+6R$TqEkbeo9m3SuFMdIQii z!$i&p{5w7)4X5eB4jH*fTC{Eh3)doA7(nEMsHha>q)!;3opNg~0IyA~qLte~mTRf)B%(}J z!a8jJ`FQl~TVa;N5xu`gwyt`BZy5%ILh{@hZzBzZmAIfkV02XocXXe@1+LJRpgv zg_TQp?j-(F0Po!>PHa|UI-({peojc&m0AA2gO5jB?}izMzTF+OR>n<`W4<(%U*WLz zF(V7DHj0T&jJ9FSXV?OD^==p_4%hd_h%f`?VyjpVmCnCS*lkLq!LA*E$nNK4ZEfWM z*1-6oxcPQMiO*jH)5mb9kUkBaZX7R$&c5{J-1VsK>#AuOs%`IX(S9>FmN<&U(9HvJB03fXRXF{RhOg%}V`-u7kkh z*zAU@7QmceiD$Q(QNhiZPi)0D zX~Ss%F}csVdrY3^ljWq0Pa>*)?42iuRR?}~0Pp_^@`kAcdkj@iIvUFA zHGOQx(EjqeJ#4mg{T$-)B3Yi%=pzvoestEYS3}+q-zCVS=@A{S(V61|p3p*uI4UK} zLn6H-qDuc(Wq2<`E^cg7TEsf8hM1lv%QGZBS4Hx6)Eb^L(R;g+FwA}}1Xn_q=U2K( zM0IGfWzzf+$D=>_K5Tv1uw$4uvfT*57n2Qt3Dqu%sIG;sla+ru87+KBts&Ml$Zv|0 z?MhOL^;U>o5m{bG?j#X)duw!)rh86CZ`%pG*UHhY#!Z>6cPI%dmOn%6wvpu>BI?fH!n5Cjypb5UPiY{! z7AaLanC^x+C?v}(%xxs1>Ry`Ds!59meRg#^_3U@F2?CT}#y==8Z@Od+d z?~6B#MAX-7FV!9YRZ6#MOFzvTP-!q`AI-Bwv>oyD8AI%*&!$~Jym2I=j`yBvnbdP! zk2&?ncIq@~#8JrSh_QC%$rSJ05W8}+yolVGN4u_X^*HgtTTge}8TZrZ1>YV(LK)|Y zBX*@_if4X^-7T`biQKS&c7spcJAKO7|D`FuU*CRd>B?r1n?%!HN{bZt!VtSMvb>($ zPa^74)g_<&=hc(ZJ2r(m`hQ>LGUST*&n~4&iYq_F?jqUn0eJgJM19($+ee=3<*#gM z_002UQ{TqS3Xaq|zDs!`#VJDUO3CsHaxaOfD_{G++%)+8Ueiae&+C4>&k@MYqVaB} zVTxl}h}~(j;e+s|k%-EVZ`$3Qf1>y5)JApsy)=&U<>KGFQL^nTLhMS&@|G(%iKugb zd%4}X!;W?~ONd=DS+YF};WUF2uiH$(#F5-+RmNARnAq5&Q-6-SSC@-8Qn}Z{STM5%sURH(E@8sjTO! zp|vs_R~T>@@^zx*3#6y{(-6B2WO=E%okUcJ85O%t$-2~g`NWO2zn=L`9^~sqe38;7 z*R&zTu8=HmI=7LCavVSN=A}1LA8!cM$F_}-%i1$g5z7t)dley$3dr(={!d9no{!tn z?_nndYp1O?h-(f^>@oD^9=%Z&vloKWxFy6%K3U$9ZrLKP7oi@tY!#LFpi%U13&G`W zCk~@w^LEj74;Ps15O3^J8pZl{hTx{#iNh4U$u1TE_p)gh1UTdiM}}sNO&|Y3ARgY` zA$H|td2PD!3*t}zbJ+VWzxq0L!ITdV-H-2D0(p_RzDH@2>)8`xcZ+QJJ9w_Ww5v1v zi8F6bOY6GT{Pg@KgMBq1-v@a;hX2pZVM7N_#CnJ^Lwm?=Whk1C5NBm%xq|vH5|RJB zqkrvTilSTR-@jUz_Tr*V*TE3Gi)8s_z(*n~?dZXM3(}8A&)tGXX4?gJ*owv3z3BQn zzY4J{B^y2*uijUp);^_vFYh4;YB90{FeKpjmZ9h(I1YzcohBQOKBI?3)Q;tqKP)^` zyWiR)3s244A3G27BO-gB(&-(0Nr+tu+3*o~Y7$YYfA2UPg*-HL3^{GbL%bA|4Ihcu z@VE$fU_Y?S^*1Z@ovbHAtcu9;YIY}yDE$xj`us8JcyvJ|3q3~@&QpK$g3guYn-DMC z$ns*?{UjovjZy_#E0NeeB3d=pCZix?ESXrK@01 z_V2|thteR{^h1bUAz9w_Zu>zr-mlbu#a0S|+SQREzBYFBSnQ`qc|99qSU{GyzFSE| zt$*j8O(LYWx1JM*{Yvv#!}$=qe6rzVkQC>|J_K0Fash%yB6pWk|GBhuTpiADU;dv$ zjPfqh2$3+8h$>sW_?eM2llm?A!91nUFWKBU^s{JlKxrN8yA)zK{TJHdOQ7i&@$LZx zX7WPNLbN}iG!p9%DAi-VmqQH7$?}qT;}vn72F9xpv{DVK98_w>ddfl!Zjt4k@P=PS z`-3nrT!WyUYLInMshi@y9%4{NmS2edB%;#t_k5K*vvTigA0PT4VP}Vpko&}@gGx$g z*Ub>Si)6Wu(MKYxpWQs-cD451KHm~w&HP>RZtjZ4lU zQM>-Ulcj_#uZ?$;2pU7!?yVO0i?M_oU8%S)al4~)%9=-96;6jFqD#XhEVCi0Yfu3d z#dI?0Sl`5R9;SL1uEao&BIyom` zszaycI{#W0ike?xt1UVs;A0{=&t+ajSD0xq=Zk({VHXj498~t_B$sIkm6)nA2@ur= z;b`F0?rGinwqXZ@Ay){SigBp=A&8;#$7wI)GH9!0=j4pTObpQIR=j&iiHYM>m!W`8 z5u#xQ2yNvl`VRy&(gWaMNdQ9iuLAL487jI8gow05N`*$g)x==F%(n(awGRB)K6Y$o zHVO&42EgI6)IO-L?^o%*x2rV$!+}fVe=3|2EFU$@w<%tP}H(P8)O; zdiU#rKB{vwXyzuGYyDv*rc!5^IJT*Ig{GOZ$fqE)?;sEdcGS0tWTu1P6&mjc! z0h+U@90Z|d99lyH8vO$R)0YIWxO@fTLB@Fx5fb0X=%gCK8xMmB$uqQa^dh<*Q7SYr zd`%qu8A?EC8RtGK1|L!4hxw0cO8+qsp;_c|L4>z~S)@)w=w%j%g>{8D-w9{~`BZWW zjQYxzlGObR2rsFIBE3moTqno3pz)zDnxBxQv%sRSAwYVl)w0j?9cX4Bnwj*kk$vv~ z;69^fpA9#Yf6c9Ir34}ETtBK=hbDsHgkbxVANVNpCp?a3yErY<;N$>EQe7}h?N0k_UF*V(y zRaFqbgNViTK$FHM^~oGN5>r2zA;pARhCUe=wWHd`Mk(7-eCi#~ov+qE0FS_p#j@Il zx41;(pL7+2lH~_cuZ_N2x88#W>3fdPnKVw{G2jK;tl%ZSrsXd>7*5BYzhrc3VM&eQ zHhsi_xFhZ(iaN&~8K`J~OsUw~Tuz(uBZnbtNy-_d$?|U0hno;TLQLv{`OveRIv0SbIG*!t$k&Cc%PL_*v|2OZG9RUpN}4zn5EZgBN5BHD z30=l6Mhx?*N9ndNranXVs7ylKLA2}Jgr>BaK}1Zs z2YlhsCN>?AAQAr_Av0o2CG9LLK~%xqJg4zt8rAW`l>#y9`xI7)f?6o9!(QiID{7p;U*kH_>V(p0q{sTGQGsS;MO4>A8Pi73 zU=W}@f1KAOVd22ja^b*d(5oLA%Sduo+)ttgc7*cQFx-XCdj(vdi;X7~eXeseblU3W zcKB{amNVjxZK_<|?3a3)EN8wwBy@d{Kc4NNs`nl{F*95Lbo&lZcSe@%3^6Jp%lGJe zNmN8(w?k5|7nZr>TaJEUFTLnvHSl~#gSbWpH_=t_G~a{3$4eZdiG#}IH@GumDIkOWXEcca2M}1pGd73& z0Rk}BkC5UK`CVE4!Vu_3VH(#*CDX=t76iUjVy6<;FR?ab8z&;aQR4Jo4?%cB?|BfY zk{*Ka9y)#!F9VhBxd;JlrE%X4WdNz$fr?0Sp2SI_>c|hX#wDoJ6qRY2RgRbVA0raDtPRw=KsU+I|8wh*?nWT<7^^ek^SIu0o{<(cYuj&V!1;A z%88{M1X3M~DaWUy+-7DYDF5A$aXI7E1@%+8?J$sgu#u*?GBBP`&pF*89Q$@asNeII%BJrXdj3Bts zbF93oNEXZ45UI=Ew0H$JfsI16=Rk@2T<)XClFckUPKJ6VtSe8v;8x^O9CR?#3Iv6Mzo&#Vi^vmG^()QvITnX8li4q4}{1BS$5QOqDi$LE{ z>!^fbHD{{J39YVqE)v^%B*a+}*_uxVIYZgC9DV3atquatTEm&+m~;kTW><)>4PYz0e2{ec zWGmvYox{6B=?@=6OM>Qt|p927-_>pLqNomJx7n>+x^p0@XVh*>$=njM0y zkVu}3A`4d8hD!k}_b(wWXnK8K<@Ky3FD76%plH`&N z@2}#%YkJfkVH2@j#7xc$pTv%W1J*Pz0 zcHRb}^5Bk1_y~>W(^6h2&Ye@9sPDK7d9}g4lE!3>AD=^&`F_B#l}CxJYd5SV;Pr<9 z(^L`dLF2~tZ-F#Gvf8ErSZVOU0jYiA#W+KP#B%tkW1R_A)xkJ)82ulHVK9n49;Ibn z%WP?r)=i${?4JWpO&(F>JnYPQ5L6ia`aqcY=258=`y0=$Q;(Mr1tp%>1YN@=7nHiO zanM8}cm)zPwgb{qy0!1{qHGy_7ciYsK);5?!CEAydx?kk8X8iBDtsOby__KPi#* z92-LQcmnh1s(v^1_D!LB#M-o3)&D`gZA+*gU4PW_OwSfAgJOaT-nu;$*@<=j+6a-8 zGN*oRlzEFCdiL)8yFjQVA-Xku1m(4_NUXi6G>$Uu1*Fnoo-zXi?>=$*qS7+bxF6Dr zgK@G9gq{PU+RsYMCk@3AR+G@ys;2ZyNFut#Ct*80Nqz_SgAj9<%+c#yPVs*~LoVz6QbHBC9bafBxLAU zj2VF?{OwcTKt`Sx&p`8}>lfx8S@hebkH9TrqfW(@#jSL zTztgbaEWLF0(%k+8u|z_>lY|1B{pxH%<~fcUNPnuB`(^01yb~bA(n&pt70j{8QyF3 z#M&a@DN6Hn6p``;Jki8+gC5wn$d$Xd$c7(7N%@Tg5~uVQh=?u?kT_)|dCs#RgjltF zPFx4qpAf;EqfTVqMY24r)#nFMvw4QBLFM)?gyp;qVLh=hb57k#%ye`m4ReL-3a;QX=c&+MR{*uodmI$|yd>1L zfY6pPHq+x!*!M-0-l#w;H(3N`=mHgE0#eF~Ynrbr&0h8{0_uMyfnhO}4>LBOtgb1n zElWUELq4ciOrd|~7s7TGDZb>Y5?S566l!iL^ev;bWpz^l1*qk`D^%ER!i=jZMcsx< zSQ@t}gVeBwQq*Yfk5%aqO8teDqV{rqqDoDa`qoj3DIDjgQW}dsSC~(`J`{a@?|SO7 z6wR?gjJt;D-6~V+;|5?#pGJefNtGu33aQ&hDORD`wy4q(kk)W*g;d8I(5>55v4vvi z4k>26j@#eq`3%L5T~f^I{0miF_Zr0ZA}Pj`n)a&VeiYmGNii$${S>#YVLc!vtfY&@ z`fEyyHvX?5!JIZLYGCQHIpw8R)4vTVHcuQ0ZzKx+4Ps74^?4gC{xafCX zXa9bvEc~yDmUi1=j*< zhSrPXgimQ)+xfGUr*zUHV);ciioF3NhgT{)C2KJ;Uy;hr-BC;eZv*;K_N##5%0Yc! zK4$)};MB^lkfiQ)q?-+tX!F6$xPKXakm0?0Sf9UxnvcJK0%yGeZSVo<`<)4VrHG}8%Mzffgd;-y z0F3XCx)AtuE7)4?+48G7 zBnQ2wPa&=Na=JVn&AUFtqMYnIwUTMVfBYe0#tk&-HVUhpka-(JOm2~_l|pp6#Pcuq zH9=Y-bpn@Vxosf^Wj0~^U8xuE-wbgC`h=)YwuT@sZWZT&Xzkkuacv;wwtOjW zKvcu=6)jkt%}&wqPpm<(AC?7IXZl+72OnuG0U}ULjmN}?5H_?PhY)i{SOt%*-V^1v zZWIo~39$+4MwSy$v#V@538LD-bgZq?ZZGhkA|z&sAJ?CoPZNgNn!gc|elBhJRx0&x zKxX=m$_Nl{5LMGA;r@&XGD*DOOH}hWftr1WC=7~?KY*z9#;}~p`VO7j>jz~`^>*X0h#dEIU>8FpnK@B_gEa_ zk)8b@`mPHy>{f3h>>C#dO+z972}JGw_!fuan5~zQP%oBn{w(25{ss8up9wdiCb|To zdg^<)-ekPKx14NqcqQ(MA;4Ym5{Ja|Tn14&4YyX~%M@DziD@e+NeqtiMYbUIFVp5LIP2wL8w$M4lQ% zYB|nY7y)N%3|643BI;8>RFvByke5>>B5ouQ%cc>5SxWPC5EayX^39L{{U`vGnFL^R z(liT1)j$bA8Sxq=swu9sOPw>DD2!r_b3oLP(cz3nHVczyE`jllr{)n<6H%N;5cXSP z-(sL_y5~!8v7_Pb_Iv^{H{@RcBI1pHsmQQ}Qr|2a`kM=>$4rJ#0a3FLw!e-=;bkTu zH__I}1Q-M4m3$)cLUp;}v zy4^`*vnGC^)iC*=LaH{Ug(P*gQTlD57WXyc@YD@r{XOhiwQhu}G7hU%j~+B^BFi>O zo=BNbR#z8>78|IF7}s(z>fbEx!dU0qCgScZ@dHfTq2#M-+5rN)?z-ccd3_2JeD zO-CX;(1R!Hf?ht(;*;;FZ-QktCeNQyhvRj$T0g1iDo&T6@o4#TXRPc8bR8O63ucvCj?zUw&qTta|6y%k6Y(T zI1BQ;5O_Y>n)V>)X?ULb63ueFAOxLfB6?R48dbV^p+vJBE5YcYsnZt`zB>p$4o{aa z;Vj6DgW;*=WNUsAgf`&mghaC(n?umI%wkGKB(hnuQsFGft3%+WWNYqY$qXd315dO@#j_+AhTu<=t?3AI@4_Rk zRpBhi>q6iqWNYpZf_w0QRu#^Iyk3LnswK0Se9Z$vcpskdGZoL0yivo;$(ht5vK5N~ zN4LZIxrA}`TA__(m&zEaZX?OgmV-p);giNqNMcXbycMjRFO|y|<57GAi?mSP+qXfh z9l>bYA(ARDii@`Gqyrq>tIrshg&f@_-h{Y|bvMKnx$GI0u#M@tW%uOZg@_1&Uob6e$^FQ`|9%LGHR~ytfqs(7SbPb ztvFzz-Qf~u(k!A7-LIgG?ndAJ$Kzm%F5O09jmZDw>uca+I@bS_O(;UdJB_mOUKQ_E zz4y9p1g%z3LACeZ_69+2BXK2KdS9|$s*7MbVHUw^qg@1xR2RV_SOkmErD?lV*=n#} zyEOQJzjJnz9KFB)em>;;%=3L_o-^k;GjqC#Q`HY}@UtsWffg08XBOuCB~AaZ=Kl5#k{KQ2EF}&13eNAIqP>$4&n{4A*tQvb{DDl| zC^$R-RgV@KzRCViQX`*5+*~3R_X*f3b73tUgXt$V8%znc{X`vZ4s2JR%H~b!n9(b# z?a@bCy`&;&tv>^(XHBg%QpZeWN2lid96bGnWCX3H?5TWTONfVi{_850UwPah6}JuM zo4=C`nQoDafrjZeK-C(5`}Kjt`{Tskk=#fb`^t!1CujH(B!t`!`6Kpmpl|4{t9w$fDRDwn#tt>H;Ib%8ufdIO<^F_3 zgtUA1Q+Z~{K(!fVo>}b?S4L71+pakP4XOlV+}QNd$&#Kw4=QzHb0HyDTyqlCn#%1K zV%0U~EDMl=fhe~Xz?D}(ksH7|B)}zSUKAwotxjD2qAW6QBfhARqxu{&_*hI%?8u`S zdIv!!0kW_yAz?uJ)V?Ser$}h{xfDb1A<`tk6=pRfrG9|_LYJ{L(+?at5VZ}B7*kJa z)Wfh`lSvLmZjow{0GFO+1yX7RY;p63PdAe4DNVZjb2Wz9D`|*VU1kYzF`8GApc=vs zUv$u}w{Nw^ZkC01c(G-Ypew){q|_Oik}(B0WN;o&ByfJ#NbA<#&otKM6hrY0(D*q4 zIz?li*i%<&rNdVrEUt}bt;XOkMV*dq;}^6*w`llMJQt;O(&1B3Y2mhNEXpYAu)t@W zpNKn*`PYe2^_3Pnd;}^jTpKhNmnrHZVBsSQ{TBdcH$^GUbheGEg>#d}qLiZCmCH*M zIumDTvv{eV(t#g{$TA#TG!`Wkbq!I5hbZ(@fUP38p3;UNc}fd=fySbkq7I9>#JPz= z=K*{r9@WEf;F}U@Vf$KRQAAPq94uT!p$h=)>XG9^6IzV4?$lTmQq<{T;Uo&(2CxgD z#sDr4Bljq??ABNmP}H@Bg@Y*c7{DI!Q+*{?hfh$XS7wLCBA=oT^O)l7M4>+c>=Q#8 zC|F-(pS1Xs>43%}kD@LX7B(VYBDNxcC^fj`dPJCA$!9zGdWB_nFdkBKV2_OpDVL%S zGkLK4B~Z1%1&9w>$WAdFAzPhN3{DP3-HSk$qd*n=5tJW;q&6hk#iaZh6f;qvB^irl z&Edldq{x;;U5@%Bsjq^HEw2CDP-))Xcp52eqdg@6xb5e2bai+T7$k)B1>OA(we;%G zqT3%au>*TiUxa;@?*i@7*gL-ic%~W{@@;h~MO}ZGIy_WVm$P{xmQd8a2IL_M9Sd*~ zpc-DZcZXpAF-Vt9TQNo5K)OK0Z(!Y*0m9@09k$Rb;y;bxhU+TRV%s7E>(79VtD(H$ zG_>He_cxJ?^I8QluZ*xyy;!ucgu0o~JBa?*_A2I^Py}icynKqfSwME*dQRx7Xb|=N z`VPls?c?ce7?p`QzXfX8*wKL4D|$#{rTMG2+eqTL#dZe(lK=yYH3w%@bFgZ>2Nep$ zDrj76B$uLY9tyPHUoWDXEBa8sC`M-EEDxZ;tW$NR*HrZ*7v|u92!-aATJSXl27qzq za%k}!yc-^ArQk_!V0!J{M@Uv{W!7UrodT}u@p`#sOqSQMK{}<5KI6(M>TGN2Fpw+)Ee;+!bkP>4ac*=&xOp$b>=K+8C~w#r0K+uO*qh;Bg&g7 z&71hVE($0nh3iZvVdUzUxIC3 zCGwjoO{-gh?W@G2X7JFoMoi*g^fC+h7kvjf_>%HVsc%xg4mqk*XR_C`*iFo6y;NrT z@{uCLQNA0SwUGoH2#biqu#+2`eR3+6t0||b+X9Yp3lQi1V}ds3pC%^R>oB~TCEah;S3uS+P(#Q_PlUgIH--KVnQb*-+rTPmi^+Z8uKttpw~dI$Y>-x9ek zlonaGJ2a_qvxp+^VO#{No7VfJRJd74k@qf60@Y2+15zs7ETAYq+#=ArnS_&DuCn1~ zt6Hete9F9Yu@h+Av_IM){?bx;Hp}#cHWhy6Q4DQ_;3H7|G|tGc>Sr!RekEolQ2jJ~ zLP~|7ITX2df`vfqXAhj)PgOSj%%Y#!M$((&00=aGn&%)zzSW(G?S?9%z&DpURCqmW z9y7qbyNN(`scb%Bp9l;C$_W|$#svTo*jGAs?39Uvb}LU?1p78z8U7q7>tRK|4^z^oRJC#~%?}g*?6jy^L!SVp zmbx?_hC9g7xlGiFQKEZ$m(zF<_B>D3f1EryU0s|UZ?PS@!6JhVMM0pU;1F-6_UG_70nMYoRV z>!2D(jho;JkM9ul+E8*bl$!n#t(5l&l>alDjzJ+q{^@AKkjzsYh^7-D zRf#5wp)m*|2^dW$k@9pjozfT;Q4DQ`Ad-O5bUF}CB^qKO#n9FWA_*8xn13Oo=^G8P zfFeJ|bV$HxatEU6f`*t+kso5(C15mti;bIR{Q_jHrz z{8gNU@;R>`%Kz26IUWY1vKvC^H?TBOX@4Z6vIQQcxF0i%|Ix1U1Qt@{OHHQ)h(PBoq&yXYmf0Gk0*ZXK>5u>s==gM_I1!_?Xk(tEVdhih zYfZZZ2toVYjUuX*65Ym>tzqU-HTeea{ITwT=;=`1QX-R4686R;QK*u^H$z~}yLm^&{i9;}- z5q*J}j=Xhf+*jdmeU}YnOmCRPZ8OHAVz-K8NN?cWhID*agIfx9(>cpm;sF#{j_s;q zg4!6Ps_ZPT>H`0%f#NW5vF}jXoacn58p!3|$SxAMIw_6cHXmfNN&?GwNW+?S7-AGZio#FLHY5ZszR8L78UZVqd5>t! z%8!WmVwJ{O#$!xYX?RxaDb}#=Qj7{L6dug{RUFz0q^o|z$bC{{R7No>ut-YKXebWP z6*S_S*RInv!n0CN&Or5CJ}n-@p?7>|f-HW_?>tLZ1*w!`)U)zfD-ISx<~@h>2p$FI zTjT3^QXEP?Ir}fz5Nrux~*E4|tSXEd`YEeg?nbPIzb| z9X}zp&dA;`U}DZcr(icAjyKI$1E#8FKE=qGs+MRd?Ou`FMd{eybWKCfqZrw$Dw!?d zFXDO^C8oXcx`v!fF|u`4GKS&S8{);TO2-xkpN5=6v059D(fDEy+5dD^qTBgzYdG0= zAl7LsIm}f~)-~T1d%7ymwe#K6aA(~ow;ecvD;4*sai(8IXg8(B3uS&N1Gfi+q3ErR z4*()q#gmd^Cu80eyRwa8;*{RhxcT#l<#OnC5y-{xh}PXWi^Bal$Uv{{hY+EQ0>l4A zWuQBBP2Z&E@d3JS9|Sy<2g5f5C`_&}@02ov%VV&Z;9vjO>9o7KSCl&_n5_Lw7}v9$ln;DLDuwy8x(#52ur*%g7O5 z%ly(qX&!D`hKihiZGPhs=+$fxB5E9!le73#%$N&Ve!vynxIDN}1185u?0Ki3^EaL*+9SMOrNIr^WsGO?3V>;=7(0yZG`piA8Zr zlV(9EkTzRo$i^{Ix>ODmShJs1rB5-EjTe{d;up*0n2`p7kp8 zx&8>Y4P-Lv@&T$R4viZY4~l!EN@+a+HMEfwRIq;&K6+=ON&1PsdVc__bDOB!3zGo6+el;cv0a>c2`~TAE&RAWkmmUspn9*~`0f-Y z_8ltY4b0QrLB@2rwv&wbp(A>92g6n9|e0!t_konz%y|Z$0kikMOE2;Q8~~59kKQcIXHAz89;qjroO}2WX#o+ zn<8*qcgUWI%z!?qKZjpmW5{}ydHHOB;ay& zpn6_Y^*ngS(-0R_Rvjz27N{lh_2mNQ&;Vc|K*a_0vb-*wizF|K1Eode;cneH9a?Yr8y(@vp{fxaTOvOFlhRse7t)OTS-J&vjRDL6wFdT0&?k23@iH$u+j7Zj zi2<)`IawHIyH)_yj8De*L5V|0fMi`MNnGQ@xsoIdubry^BF3OYPS+=n95@s-i$$eP zL0DKwY!{Qk@{!L=~pV7LQHoeVA@JO8;=5jHeyXL zrD5B^mVdHqLIk6MH*SZvTK~Ad12H)Ed|g2m9bZxE*EQ@2YSBHrcZz?%qBL#xU(EX7 ziS$qdyx9d1*0(=;W*2sdctweBe0w)_ufmx<)D5D}>5xa)92Q;&)fk?5_W@LoOPw?! z37$I+h>Ngp;Wkxl-!2_YRU^iKk{Xe zY)4oH(J#A>kb#TWS`47M1cDduEI3AG)l0x~QkD_<30ykK9O#=%9D7xHUS~e7>Sn{0 z)6`*PWj`aD$0;xBOlPI8?WgeIEOi)c+0Fsf4IaYly}R^~kz;gAYC9u*bCZhUm-ReA zl$OdvHhe3&t>z#az9kn!NlPg}?Mg1MegAiA@pBOm-;;*{rTGVds>Q3#iO(ac&F3LT zE|Q9F$#e;z`oK8s0FBJNKT1YqHp1gF85qhLe-f+vD%d~aimICr->y=JurYYWcYQHa z%l)&eTL6E4rVc^lzb2lG=Udw{scW?maZyGc?q7V@0cr;?mxP2klbT8}Nz|_^O=FhA#pyOM@DRm5 z10Z5}O4_u4=#wXo?u?8~vn1^~0T*YHhNmgEPXL~o+Pjx}u8i2-06DcZ!@W;Qc?G}- zP*c_e)@nsQhPi5S%i!Bwl5lle<^e?XL;E(g-_Y1@Y|{MMDs4GpXFh3h01GrU)|PLf zq(!fQgC^4Y0xSZkHeggQ9=~_7B(%vz*eE1mm}|@dh)f**@(cRjUGRM~Cbfczo`K%$ zSHj1oWcC9P0JRc_zohRSV7bkb)p8YFG?RtVu74Ro&4l<~y&vY|qU+cgQ`VLRPOc*9HGtKXq^`X|a;#BFYvA7+l3oY+tP1HxknDMq)bTR}R31qK z0oDREOnhx1x}T}+G2$_qP(OI246!dIKjw2p)|ceJ0bm7)Kuo+`aj4eylGZ8@zOEiB_3u)R*Tbtq65ayXEhY`b>^k2bscXFf zL9~~;VE_(*I*BR6ld*u@P#n%gWa8Z?iS6J{fSMdZeAxR%7KVO=(HFS|4!TGh1#n8l zys2QRoHMF!D||Xb-8%p!;;(OVs^2+Pw+$h4jyjC#UEhe6)LGA~1sA}F^VDG^@4Ns| zb5hEf^f!_|WanxrRY_mLhf97H z8CY*JfqOhp)jZ zCIkEm5IJHrDs!TK;Lz?}yYpVv^+09rg)0xp90%}_%!Ig6h}iTo_~U;n$enQqi0A>R;jl=i7>Ep33E%yx1(D&s8`Ee;}@X%_M zHjzbe)<~NV0Okni5L}#=c~aN*AmU{nb*TW^0Cf{5Bu$>gekyq^R#QecX52f_!9$3e z1*A>{SO`#yACJn#?Z7hO&S5AfR@)Yll7=W+%-n{)IU*K|58_M6L78LO^BHjuf!tnj z!oM6+(*c$MG)f-Dy8VN`TdyuXx_43AC>R)oxQL7+EQ0Jw2s5*I<}IbI&c94OgrjhA zId%U8SOHKsE)~nxBv@ z9hGZ5AWho15laVXG8do-AaYPrCKhr|PQX>J-i;j+p(7Yghe(@;XgVy~k5Hb|p>L1} zdI3Rngt}}1?4vRQ(*u0RRNc3Tnquna0~{9x)Ok;+x>9&?lDY)|E>S*$a}=>QFVDeu z2#wR!VRT|RBjQKm2`IV%>RNq|Fesr8gA)H)fZFlXGC+)o8mu%DWp68yI`jf0b-avVxIz+!8_uf$ z4dc?rq7e$V9>EiD!TkgH&;Nt~`I&qSHXPRg8pKaaO4BFD4|%QIDE&C>!I?S@$85$e z1?X+AAVSJW$N0m39U!tF7CyjDBiiD(WV48_fy~IO2$7p)VjyDkF{rQrDQ+aF^CA{* zQ?~)&j_CRhCw$=cfx4d&0QacN2e>b$zJrGu{$Hi8!!?+2msI;h7H*ST}o6 zw;_BOVP6>F-A3FjBoE^cx2cl%rpmJ|R(Y-OAchu`hhc_G0jQ0q8u}!>#+o4SORY;( zV&q-K(Gn6du5d0Deg2BWvzPGM6tO&6|FZHgxAiVjiLECb;w~+>i0X6|d1`S^7{btu;$lJ3y;NT-fkBwCHw1zEW z(R)hMF!xqf+3GQ(XDgLQ0JZ@{^i7_|?L+&<@t(%@mCB2G0%yM>51p)UyN1Wn5_*Cy zqtS@r%Yrzsojmlg-W}wPN*I!;pBg`87&}YHF3GFQr&gX_ZDv-UERHxs&d>!yD*L4A#|Px4xaf#=#s9{aET0JVd>QIcpaQix@O1;;b(6*mIo%XcC`39>XPUfviuQh$j@-J9c9F zWHyTEIB3(cCTuKcXmcK*1fW3*o}Xg2pgul5J+*%tR(weY-+xx}>(&C_e2#o}ZQqCu zNr+VRAktBOfMhyPB`#6Z1%QYV@qJ~p9m~5P^d{sruMM8Dl)PU7z5}S1+;`{zFwm!v z(V`9*h9Ag4P#Zh|&&WrtJpJff$ay{z9REeAbZ`4do4XEE(y&N-${1{A#TNvw z%cM8&;JZxfJD~c00&19$I2427r`gV{GV`b?WbVC6i`MmlyyCer7$iEbsoHwbdahC1 zwJp#uB6SQy@4D1>tPidGy43anx&c(5_mNMRg|3AM(y0OXE+6^rdIH@7Y8brX(sxK7 zospiJoS7_NcHq8btkS%;^A6d@0SLsq;^nbQj1Jum^XiIsjd70q)W!`5`W2{Y{Iv0D z7(NXcHu7l?%nzj1^Z2wP&i;T_Yu^QW2vo1%pixiLP34kauLL`2)9cO()^@mVf4Ps<6f&`sUw+WbV)(l$9jBR-L(qu;P1*&DHSeuNaKp#Yo z@FXkYoz0(+Gq4!OzH47{G5I1NwLo-(!P(zJPfcP`B~>6x5U1s%FHc$?aBhY!xrs?d!za6b!gb8&pnvaBLgM*;&D{<%@eP%(zK%y7Id{ z>n3t`RdB4EA=e)~5S_|XRe`=O=^v;H%NAN(udu*=mJ9!Z8z}!au^xJzZ@X~f?{g+Q zcnvxRcTC_IM9;k;I^qQG5TPG{YTPASe!vf#3n^oFbvR_$4Kwy%hCKi^gCBNv!)%Sc zNKj{Elo9ehwx6In=ILZ|A$Qk)Nazy+AMIYI$XD3D17wZBrJf9y^Pq-RN|Eocy;%~W zXzw8;)#}z=KD`?tn+vDLri3Ej5ql)i0URM=RR6&PN9nt;)6(#ZDatpx5`>}cD@IDK z0DnrxWOiRM8k?dMw5f%ok{}%5q?nk>8RDlj#6pVl-L3?v73XQOITih=r9?w4pvaFv z91@^n9B0Kf=4k##L(HehZ$0c1plK~ zre|<7BYkq_n9l6YG^V)}`L@|AK}~?~g>9nJrnSMNA?8rz>tBlms1WSX`0GTaeU|@{ zhM4^$iS^L=N)Q2X87Z}TR5_2npEM@3uFwSCm`MUujp-^<8dsWh(huqz7dsIjGBI?# z-YVup@WBIRzT-9iOn@3QUIU1FY1F7uT1(F_RV?xK4n@B7HIxyc2C+|LSsG@Zx^HNR zWfb`e*e?O<%YRe6kgl{D>bj*NUZ%+R!9EGtncqfA_>iF^5)l!1HRMu?d@byi0CncQ zCswB`&E9wXsv(w8*@YbZHf9mnfaXe;~;?6$?DJ}kDH5636q6;ZwIDSr}A8D!$J))hhnH6 zzDocfEGFRuG0VS5L(E=GVhqAt0$7+8q||*oB{enuqm1-%nff6E647A#ax`|cme8&h zVq5}bU|Ncl8d%;-?tqIR5E_GWilMEu5Y=Xh0G4SjJj*o}cPaASzhOlX+Cn09GNTic2m_!CO@$;If4lAo?WWQLfQiI6sG6*$I?V9|PEUj^CC2ahV)jh(q{00m6q4OCE~oIHDonr6}L!A0_CEYv7n@^r6zawYykDETbr2 z>`M@jmGt9l_8eM@u1jZ1>p0ZRWr=GO0_th|g1Daz>r61;)y;0JN)Bc)ZA<)VgIKvB*Y zkYEtv{}NK7hG3^PTw`*msBU&vi@~|)t2{eYe6y+oX2{4MV{!+!R$K;@$;kw2yhoYQ!AORxK zasw&i)>Nh8-~Bf=+-x7Y2w1ZOZvoswO2d8$z4UR|ItKU7ll6mfS*50;{qo(`7|*&x zV+62Cf?)u6Me;PIWtR7zhFDHfPEEK^facx!D?p7vDQrRg8iTtO<$MPTQbOXgEGw(>{i`(m?A7Emq9vFF zU_nYFEWi3eV)7U)f~>v}kL{bDj*HK?Mq@qeGg>pGCHN=6=SZp2oqF@KG#2G~v|wzn zCCC8yLTlmqQe$wJqKs`T0emp5(;B$fYYfUL%4ri4Ou=}|zX3_rhQ@apI0_N5QA58> zQO=~0;6ohaCZtq31gA}7P)bowr;y+y1pF4HG)U+^AhAnA_xQxBjiO`QSNf_~OUX7G z!wZiDXa_w7qT7F!n7`V$Yf34mDCb;AU_k7Djg+W_fxIQ2l9rj0s_)jhC$0(G4vk?E zML8iug6TNmonq5}@gbD8P(v)FC}(F#FawvsZlp9Cl#(_DTL9wIHuheLm}QUoE*wl~ ztP3d0X&VyE#C737N^R9T4ZH1rh-<~XztV`$^71Lmc^neV!bNgGyqkp^2h+hyCWv_y z<)jV?KEYug5+X}!@i(JWL(HWpXLv|38<)osq|_TcT#qLWfv>NzBPZkLn8q@PqMZLB z!KXOHVo~3qv}^4@t|4ZhAQ3ffmS8TxN%0qh(zdYV9i35HC{Kt968-xe28e_iO06vWPa6ATigJF51PZQ& zD@dsqH!(eVG&l4Ne%_8K@oFrKD9Sk}66D}w_!%jU1D2zcg6qX(@|z(J9cYdRuz?|K zA!RxLM1m!#oHB7|h7!}-a)ZnYVgW@t8ASqtI=IOSZ6=1!RKi=EZ)w>16yho`!gtqMWlL!CD+dw%GRxZwMA>h@}+e1QrRt zz!k7iJoyCcd^r|rh$R%|Y!(T=M4&H5O6|ePqlPCA?>|(J&wV&9&=?g{48{GJTLLS< z5~S3O!-iGK`VoBmViOvRB8s6Ohr|tZNwf}OZAMZf+@s-iRQ5k|2_Fs^H0FgAxpJRV zg7p9^#E-L;4kIlqHN*mnq5noKORxc86;f)co~Z)@vqfW)PcigAI7kUL0bq5*PdN(u zTtm#G82Vovn*^Hy@{kfZ>eqSH#xFD$xfDaun_DHY0ep#+NczE9(fWQw>+|W#`UufyVMOMb4A*Nw5oG7gFl8e)Vsse4KT1U@yQvv3CwGCHnylv6v#KP`M>=02Co5JbpNz zd)W?Y$VC)6dCDchK7hkWso!rHx}+}Hj$7XWgMrv?-JeI$9MPB-QpAL+tT?Ac`*Cnb zkyJa-Imz)1LZ(<_RX~wFwnKsg0LPJ1uc}d?mdz(MmiZLfh1(@40&pRvnK(aJiT;b} zw1%8Vku$Sw5*!3LgOs{ejtl)Q4$62|W0y-YbRiB_fI@{^!;WDoB*Zby=f2r*5N+^e-!}myV62OO)hMEj;PE~9BZRjeEiz$X;5a5=;1#n0F zFkfla-gZwzETR~SUf(6bDS-P(X(DbdP#Smaj&Sg6_=OZh(fKN^lmSe7o4NKxx^={8+=xrx>~taW26*fG69^ip}zoq1{B^mSvKr>8g>yyPL6a*a06hih+2$yvDPmpUkDe08p zCV*AExfnN=mh~E90maaK#H$28fDOX9m@jQNYKZw1Ifv3N!7YGI;^<J*W$kl-1plx%xmrx>~o2eX&p0f0mNAxG)(o@bwic$XrlVjA`nJOnrZfC0sr2^o5PFoyZIQ&N-U zb3AvE#5hD}$vO=FI7wB;w)!39$ zlQ>MB-6ggSjVVwk8l;v<%~u4z~z5-0u~(qvOF*BLIPSglofNC?^%%X#W_Sg}X0 zWn4f}*BTi)E)dBr=SsyZOEISfo$cS3V&0a`6V#wrHBy64a~(C7D?tr<$5YUB@m)ho z;~IhN@fB{xx+Bk{3{zQ<@4XJxtfuI;LTOO5qw1Q+C;lju<|7QZgDm$QvLbK?9bCA% z8neW&lWO9+4?^SGRf-D|Vo{v$*I-7@2O?i6EyEn;UyBn$iLT>$6ja%td@b$^rA0^E z3_J3Qs*=|;YFQ!OSkE(|RX3RYMEu#Tw2W}hMhf4$p#zv;Mr}Ce1Sx3gO`zz|kZ+;J zwlJtME)wUdK`Ztbpr(8&P*|VHSge;MnD|GOY9@;8K2>{uean!F^BXvavzC+I z2Xt?)s=yKmwc%JfMctpFFs=l8DoQ-7?P0oz#=>+qr(xY!Kr*ZWNq%TngaUCMc=(b}Q8yGk({3u{G7)v*V;)7_TTs}D>Q=mjip7V5vYB;| zA6z^K{! zG=Ix<6zYgSR^E@Zr9l!_&PC+~mVJJeHHY6j$j?{|ZH*D@gEQ5P$075TtmlL@6I-0~ z8nk>DOv6bn)8HZ#BRe!aHk3Wge@aX6pC+LPE{YNWjR(PnV*ZMJebiR*z;~8rJ#nhO z5iM5Y9C_VHz|OY=`}N`MGqyoUkd2digGaH>d$`mM^04?f&hsr2vFKUS81=ER{X5l0 zZ6o4}DeB%w@opl1#_#?fAY3iM<^hJsymZ8ll}i0A*F~gYdsb{HIXN>n{&h^Q!@2!Y zrJ-u;s4Gh_M)^xZ&Q5CUR7MKAAe`$fl{u^AU{f?2CXTDn)_%T|9xHhU3o-wUv=`Ot z3zQNx83PkL)lZjVDwCy%m|SCnmSe%PT}MJaWGwy1?J2rIJr`Ow-V|F_VLf)M4}{v- ztY-?ITvH2QXWd3xSf4t$fN}_RoMR#3OLd25ctktyUU}E*9mPQQl80bVYLr`_#q}lo0BktB!(+YNut6%ZODE70%eR zktX}XKXF;9Vv4$!AiIg=k~a&*0*lg7XI(6IS`d{^1&XNAcv697nDOGGZS0GkU*rj1 z!koBIfVx!}MO|Cu8aX1#qo*JUATo>GVyB%ouWzbe{8{55ecjT6{0#aC? zYB+#ALY)m6*oY#kjTtMqlQ*sse_x|CkF>5rYWU#9VO2vYkXITE-oQGsNnPV+LoemZAK09~C;{x9oWHqg8N9Lw4$waN2tYY71`0&@e zPAcEr0i|(0m52u822D0t{R`Q6@{uU7g^I2|;Pp<}8a4)O4V%QvpJOhqd$ah<=SuSk z|7I!>g?^h8pX$fOLsT&@lji~N!kXvQ3rIdT@v~Z)AOVUt`fN9{7T&X zTxk>O-40TC`?eYFajxwmCJ$ZFMZ0(4;aL$dA@#Zc98?q@!7X=DqQHe9PTjh=v< z90!qHXG&V-=8v5ac!woHyt-BiZ(=_T250HoodDq5{N(or>we;^CnQ4(|j$4E&1 zcw!Px%5h0}_5%>C$4LkSH~|or`f)nWfJ^F|r9y9UQO_ph6o76jo*w&8Q{B9=`3zOn z;8KZdiss&TR+=WH!PIn)dRz^rZvetS&d3~#7Q_uK&)J_t)G=3Ze}QzE7%xB@p*dd9 zw>w0abxM=Elb|=0GD~>t{$6bQLTTQ>{{s@Z>DcILnaTXD%ym(G2Ssh)MKW>V&dWQ* zL@VqwVDG)mR2+@ts(9f`9D~P;gow7On6w_u!G3LrI01vcQ()k}MgtURyAFVzL%3|V zy2@e)^+F5z5H#0~-(_Ro?DIX{Q0c(C%IB0snLu?xLFBsY$&=3J&ESHBF{k*lDDL6#K z6M%rn>Vn-p0v`Vdh8Ba^V#RpNKV2M0fzO*~>{JibHw!>x7HrtEU}l=Fnt4AJo!2SN z`xuQhLusD5G~)mzxU6{lKxxxqX2^y%V$9@Z?B+5S2ZPJPJ%6Y8{tKL!8PNOZGaFR1 z%Oo};-}ilserHguAStk_Dj}!&dI=&jJ{lK0HaQbJ{~}+gFp^I%~dak58qgJ=#ubAB{7;`S$k&sKS(8pA)Z43t;EgsN~3!E4wY>T+HrgoEz7h!U7vAn6D3^fb#>@O+6fS>w`fB|a%4%&p_uxRr@SPZJ!@B*J?~$nExXu3qvr=zQ z;Yqd!qI?i~5dhUUupd7*>Djp_PJr){SOe?YrXOiNVg!!kvT)ka_;`Op3Os0vh)_4R zc{Sj{M!0t+NH<;;b+#zY-t~Bc^x)nug97wz@bMayk)7l>F8Xo!&Q8wZDE$SgYPFUT z^2cS#$_)Mt#3VxY*e3O|uu1hAjwzB_<>v5#r+OZ0+2?uk0+uObCa3ee0ofh= z^(&=$GxwKJVLK2^2_8QsX?(JbYIX@?5!5=@da?N{rE#=1A2e)QR!bHXS4dIE&(kcM zg@;5m?~nP{^p$A79S3UL4h9c2wp+K(FLPgYqg@PwW`JQAv#JqNAE&YbZe1wqx-hH4 zr%n93NoA=V%3~CAtkI&I2yvcgu02K8x8}7 ze}v1HO|W?GYka}>@Ceda#r~rJ@VfFMa}|@)v}HO=EvBh@G5U@JSL>vYA22|+!1Ixh z-g}aS~%ezmE*KH0@jQ6v(O-f7|Uw#1Y>_P3UQx<7H4@}YSM?i`NoLW=H7+% zBG1poc*3rP|G{-$Wdt`c10(-iBn6hYCgkj4Cqd0gNgo8CJz2gNX?FB?j_=8cz(sWt z09OEaqKlAG(_8)@64DO=atX?3k}?AUfriup<1E`xNUnj~e>s@NS-nb{Ix4G%1=%Tb z2CdagUi-GOonP$5TOGqS$SA8G%EH52{DNh@fiwRLl)68lk1j6*Qt!mGuLFkegPR1k z$4|icMV11I6On7ae*t?>>MP`jRc!iIz} z!>_wURH4$egP+;(2@dy;M*DyU^x` zN!Qdo&jnaV;1QL~(=lEAXD5b&XuOv5ulo~G7Y^xcpNdnIT}CN)u+A-f%EMr8$59lO z%*{DZ41t4#E%V8)>fxn8*(XsXmGsbTQuD0z@JfK?!ilGnd72clY8N~)E)~1@*D9n( zEe*?P&1L>$qSUtdM!@Y~ ziCZI<(cJi1z}%B3_98)Nz@9jTO0)J~GMB37?S3Ga^Ehu*%JXKGWp*lAj|BDdxJ(#Y ziql0BG~%ljjU%2lwqAY zXt8e-dv;@iPj`Wu$7>@7_QOp{*WMVU*tUzC(A9N)4PCX^wp}@LvF;Gf_FySa=gumL zmO==qs>)9CRT-ioA(!CF?kY_4UNI5oz3q-FiKhLP=Bk_h0_K8TB8LyMdP@kLk9t$2Ck`Y2s|xq4C?fZ%4>%f zq=dYL!~w&B&yt5Vh=Sdj`y6@E&HU#`;<|$H?i=7RU<^sl%WPsg!@u*AF=FuBz!!jP zU~MHmwuMf_Ra7cz?f4wBl(gZm4Mu6+??@Y-l$tUgkMU9UKR|92CT`vPq(Rf3aMA-A z&lFHMdRaHP3@(ZyhobLbza*(unyFyG^hQ%prF?Yqlc>E9jjQVl5_GIt?^U2@QpSww zlEU4ptzKpmj!596Z2p2bIIqC#pP5Z6n^Cf=;lk__cvcteSmNL`mEr1fI?8B)V%*mO zY6XhvQhf|++du!1E_S%bW2iG=lHh??;=N+IhZ)&cv8d$iy+WB64J*{`&$Z}HPoUPk^0(o$@>HMc>ZH{siF6)ImjRjiTV z6F#-64GBRQnI2d0yiWpI)LPge3xjB*VK-bwbQq@tpr7UX{oGL%BNWdJBq7hJkU!(b zp1RgHFfR*s&ihD8q7VggGmU3l1k?8%?1eg<5=*tMex}dqTLg@5ZY>8 z)XeRR#LWX(9NE1nkdJ$DWj?kX5mTf@C%cv)t#)kN&ONd5np_VLXG|as2M|(m%sm6O z^jEk{CB3pNCyTe_G5E({ko6v7k;?GowDdHb)0JWkii)zYLYh2uo(hvi6eG2X%@WAZ zwuUBZts6fVkEyhN9#C5IDwXIUx*o)}WcdPVIz3(a5-51sek+7V)vKJbm!x+gA-EjO z>!1vUiFrLhpfukGS}-1hCoFg*MFrp4C?Vh(BAz$6nSiJyR1o-IM97my)SGc)Yynh%ypZz#es{H{M9m+DD6myW+ z$>yq(XgtjfdAPx6xSawS{ucpwMz{{+MT6n2c+ZJt6ldTRp9P;izU3SM>La*b8hZiB zYCRig)lC+kfu0AzTRJSGk2h#&(^IFhGaxa#sp(s?!r@sd0EYNjRSf6$JFy5_o$&{; z$%%z-JRV^?g4sTca1t-l0EHVasoCO1Pa3zBk)4J6M@f86fh#|fi1PiH0iMC8Mp#P^ zVduIcDf%UF;tDA!+;#J zmyw9|!OO^s!r8tKfTj-DTkIt4RX7T0wD_eeDW+*hd?awC-~6Y+F<3a)R9 zU#vc=M8Dv$4<%g3kOK)G{ErV=jNM%Kt+`@^COz z@&wq+cZ-N)O7k$&7dRLy>6vwg zm~#x%nGLgo?3lpw`PTw2SaCd5);Pn2&=3q{EuTO}>_-E6yYFii_h+$fo`BNx$ zXED3UYy_%4D)9E&H%DuPU3Xp&l(!KN8s~Ao)T#P}elOzmFBV&%)47(26UBIg=`@Rnkehp#fm@#^ z8(YUtnl?FQ{De$Aml=<9wnB6}j{S`6tH7ucj>$O~cOWW@DRY%HH$gbwMj$wBYs8G> zN}C?8&zRP#ZAL3pZJyS!kTU1dItjujrcQw&c6mO3T!|iGUXL`i+&VOY^<_;2M>n_; zvTvY)`c^GxBd|K!&m-g{0UJTh%<)OFDHHLO1NCA<0!RBt=Qem5M{lLfH505`0HTH` zO&*`5m)yWZEHBd|WJ;H*vB(L9ZWT*TV3{4mHgWR=R_yu{y!th8j&N!$1+b_Vi{~|H zas7DxcS31j*Zj4bIPA5)Y`sO>lbHNt+KEJd#p~TAhMZK|_c!iFLUov?r=_#ChNQV= z3O?nDN29Zsw(LtB0MEo?%`%KbQTO}Au9FA_|32zt;K6>4-c=-g&^PoIQ4e>02MIc$ z@(+uaE_4W9Clc_^FcxR}D4@LE;^Scc)bUYB2u5X|V=51ix$W4G*`>7a?LL7d9Qv?9 z{ZaQW8uN}XxS@FP*&W7Xu2WEk<8c^og3gE&D7c=p1ZmIodhx{`y_jq{CmtfXw&NQl z>-a##d|t$yVn=cTDb*yA&9!(FiM?#!F~_O$$%*j?U`^4%p(n;eRu7b6FEB&HC6No; zewH6AlKhteu~1j#n}>Sxz_|fTNJw2caRr3PSd=4I4@%WnV;KO>o4l~tSPKg>5dS)@)NO3I30>`2*$hrjO-}j{ zk?Z!6&|c@iC5|8?o$HQj@E8W2e0O0`3z=0c_2InF?1RSrw0 zK+d(I@GOdTSXpe-x^r+Q*MTUH!M;I6oI`%@{3`ij4=K7|e;zJ^%~jH^Tg3Yy*LQA3 zVhzNXtTQ$zA{*&C^VeeCIi+Q9yFHk_X(v##YUq{ZfnfyJfoBT8Mfiu~vF!o@w^V?} z-Alj0Za&uCNC`!3TKC9Y(9RkhqAOH7%RZ6t4L*zV?}rAx79YN<)pa58hy^1M-$5#? zh0Lu`2IFEG;{7m`5jg7^lQ2g}UWi_&%3oel_rWG?Iea<_Wmp%w=Q&0m3l*2Y!ITg8 z3Go07(;t2}ifmB+GsQT0GLkX4(<;(3?@@RA@Ir#9z9`zWld;b?fwE*Z&~tTO@J1 z7v7-j`{1oJ+bi35v=0l~7g6NWvn~Ryz3Y1ErT~V4m z$K?}^exzz#@;pRJV{B*VUC`i9&w^qoC#94Aqm;3k6J%|;A0egE>oSTuu9xVSh^4x4 z86;i6qya9G=rcG}Uz{^Vw{J0-!#fKJ7)eh^<|s(!>6i@zc=ZYwKJ?6nUgMR04pJ(M zET*XA`iE|b_|nLhjkLzX;9bzLi5{|RK4i>E96d=rht`D-S(8~YP&yYvsVTv-7%7z{ z6j0Q)0@Wc=7?61h(&QV5;1lWK)!G_bJGDG^`%(bh00iG$W02ejSF@SMcwix#c$9k4 zZ9ud!i59kH0O7a|;D~C4i1J_*)E4R16(r~Yasi&1FlF4hiAfl78&*k9d->*Q6**xD zj@1BBqf@ZYBDZNDKRJEMB(6&1x2WXy$k4oo@hn zYXQOry^GG?`-RlUJP*C`OX{lwSOIFiF|_|{SSKZQECw*1b&?j{5j4Yk((vBNumK>P zG@Q14Nf1%rE8)-j^U1)7*S`_qnX$=uX(MmwHcL|bPRPZ#nVgycHh`!%`VM>zFRh1< zh#jsU-nlnMp3bc*nQJ0?w~~wt+q>=eFedBY zPM`b%s@_~gljim9MWj!!pxY0MKYNg+>9AUCPh@F3OwNo7j?F2uVXHG9Rf~NQ9P3eX zwpMVg$5?DX^&IIt41M$6fkRQO;kYzu-wP&|<22b;VPZJ}x#pYcW0OA6_mg*WCndSn zOCXzFBqx6wtWxtS$l*M{IM=5oPZ%yL;jK((NHkXvO(m2WPTU_2=lZN9cYhg~8qZO; ztb%L&26Dr}DIZ`(qrv?LU~oTCu4SLhzS1px7je+;Z$;!Kyvp^Lf*Xm&JU>WF|0qqq zx5M$dzE|6)KmG~X`@RQ7(|R~BA_c7no*A=4DW$0E1FBb|>O_~sl1o^b)^SnMbcc=k|gh@irek49s{J3oqf^T$AcnuR`s*2DNNfe<4q9r4i&=uanojvGY1P zXe*pI0K(*rk;SLx(HD6*eAJ_zaNJ@Z(Cdd{KLz>Z#C%8cI>du#ze66H2>V@tdc!Lo z!i<@QTd<4|&>Y;C?C5@A+wPN%Hp2ERKzMw@JGhfEK9Gdw{XwukAOVep^&vpDcj8CK zV?b*tmy8wzz_65)fvey02%viW!2W}hMx!lw>=1J=E78yRrthohkea^^1Jg_-RGc7r zOO6xdoh26ijJ*g4f?@mw49)rRe2SFH*8MI;-J75qj6__E+C6ul+GP!b;Gc_RS>yA? z->)Fs1SIu2rpdpEqAn3smqc8*+M288-(olf=SmQw_(U!PdooSp^BGx+Wi?A_ z-rKSI=@QJJX-deasCye(*(KuO$+T82q53EYwlBmfbkjPcRrUKFq*<*`=W5uX$u)0cq3H!}yhJ$Z7f^w?*U`Ty~6(3-Y9oxgXRCjWAZy7xgf77%ez z=GiXeVc6e+4PQT-9D+PjxLTzg&zKm=Bu1TS!->ewG3CWGkN zPa>`s&jAwE3|Q{}~v2hZgsuO`3|fST-rxCsoJ zJ?k+f1m=PAS$jy}fnZ3;1lUS$^aS{pD|I)GT*p9d-H)C$x&r0)`?5B{b zxgty@NU6Lc@+j(3k%3Jj4k(S^h>6!Q!kGwcbwiJUor*i{^wcS8z`{Gj1$p-Vm5fohhBLs8!kETs9fri*F;)1E2-tudR6S0;mN{PF1mJU?j)xJyx& z398`=5l2UEFOWLijF|%2|1;zUo%qNga3E8#UcMaLx_*&m{pmx{e7}IEsWImbq*T^e zDMj5>P`wgyc;L9DUMtblAb4(rz?&sZK;k!$YBO?IE#hMk+;^WY!uG4Ch$4!*e}n3h zh@%VZL$wH@FT-?o=Wl8mn0S`Vy|UCs)@eP7~XEjx02a-~e_kx<5czQv#IH6mvke ze?(Lt({D&O0?b8fOus)saG4UIgr=AWYE+_zoWEBvK+9($EAAKj-HNz~rf@UR$I`ok*O4@xg@R;RbyM6Q~UYnQiM2hiSkgP8N#YWIvMAauvc(X(L zTVt?5iSB}pgD_q$vt{lk@iP#edw}?SRo-fi`1MZF#VzYQ_94~yT}XI8U}Jqos-saO zF9h}j6c~3m(IyA=XcUXS&G5ty!Bg{1?AR!GwtA9-^gew?4Xw$;Ti}i!hMNnz=n;Tg zPa7{rVBH2{ppao&wu}^#!-?e>Kn+R3x3|IYpO6{p&)-~ZZ5=*A8rF2-AVV?BC*+M* z5PheNJRkWSd4^7ri1{aU8lZM%p4>3VdqzKb6P;o^h{3b)*O3pd@MvlBxRImfoDw1f zzt##d3}}J#05$paDNf1x3MoeI=MjqOD3+h7`kQ0Nk4T^J2G+i=3$SGu;>$0#T$EqvgdOH4tCcL{(|DUqOEk;M^FoQ?Rfomqp?7tx;NhrCxex%;)g(STXT>4{3NOmowy4@Ju>WnVeUuKeXg^`4lE%LGcFUlM%DMODB;|D9`*w<9Z zLOJ>oCdJlP$b#$iXbf-k{tYFGdi46g;DR%-L8jFmiL}TDhQpZ|`BeWio&Jr6a}=E6 zjdWtf34f-qrPJq?PCfj~Vr#9CmtK@4v{}DFuXn2<9Rq1_E1hhTJpI`ioStolb1a;J zZFCZB*Jsh`-eEZ3K$?FCofvZbJN099y7K94S<9DC2Tp(AF1^X^#ci5sdytUS^FiKI zB@}a@^6t?G-Nx;9$3A`BZS-)@et4{Sj|0_eKLCvTrj;+|#-EsFLFqoo7<^A7c1Yh1 zZBy4_q+q6NH%&f@lA|eyU;W41cu*8Mrnk7mnagI~f(z}FApuXcUmG@@qo`hZXYu0?M$aJ;_e00= z!T!hzqsMaO)N9^d+&;-)ykB<102pfa8!dsx}0}m zVR>Lf_FeIZu3v5x|5I=szrtIUTto@qGorN1g=dDnpweTX0fRwM5FESFR28vFh3uy4h>%y&5-?G(S-PHPBrnaIAT+0lt5855es5Ps=xx&bM2OQoN)T45}9~*jP zJ>58bhub*(ouGN#@KzkY9e1Hohi$%qXVn@rfIG(sfc(t>v9(44c7e9^6L{li0Y*OR zAKeXyb3G%Ym&p$mI5!wU*c&>@&WwRjHsl^~Kg?wi^IX6nD1-Rnuy0}zoMSSG-D?Ix zQH&rM5@nFR;NITMAUGrZ=++nx8Km7lIHGxU{1GuQ{zgAHVz4)$9C%e0gCk=!+7D`E zJG|9MWe|*v45B+NnlR zr~H)Pt5W42Dt*6<+d6>sz4#Qhfj^MX4#=~dex%DkP;vT9tT4F@#RS_ZZ zy-|j9;9dD1Ub77T%evF5wQLo>j5M}N_=+LrnQLV3D>X7d4{4|r-ipkCD{SjU>Z}(49u1~6}SzGP>$<+IQHuT7Ux={dEjQW=KcEsSR z$lQ6?$owLrZoO-Yz2$}&2X2ZTzsby-d;^;2H+ZX~g4nHato9iP4bKtBR z{huo3azr&`Pe$Oe&!g;~aXZWpdp>O3YO!@5(y3$rP91x7>WIo-V8qfpKA>3}#1??^ zfRr#?aFG$N(G`UIaS?pgkP%K}6mYTrj|a4d%?dw4sStcc;+ND7vMp3e+Q*HM!uq4K>3 zr79?HFDW=G_hy6ALsDW}bbAd98Lq8#V?cD}0br@lk2>J%U{mqTddxUpnMOa?{b1H| zZX*+i<=n1EYirmh*~bt~Thu@rLE@Lun5ynY`3LK5261i_w90uIK$3jiHs z_{%Aeri@RYgllfJ!*0pcoi#OUt=Mi-aZs^6`pTLb-Y?oKy-(IgoakOUaX8U^01rNy zVr(ag46>qc#OPS0LS%fwY28K6EvLl;S2=nOa?fq zcdV^pckR>C*`@)U{?l~U11JJOZ<{h68zIYjbDcF}Gz86emNdKs;yb5*R$FT(oaYT^ zBRIY1>1+V-rEHRBS;a^&PLOOu(H<-hkUnzUyk^zx7m?Oj-+X0mqXv(`;|{|%Pn6gt zeL}K^FXMbm9Z!iUesGtJQT_=qo!^s*$HrU){=oE>O&k%VvFkW4n@&s(;VV+qvI9i+ zt0bVu*h>Mha!<8E9=c{Qo&qCwjSO^~*!4IAF@jOaX#F%8(I^?{H_@8_31?g2mO<(W zQsfp%=rNJ9N|KEatACcHHl08U|4b5kPWTr9WmfdvHj304w9swR_;}zB01Dlk$LuXP z7+t^!mXm?L5&SjIK%qVNB%@1LFar0;r~_a>D9_wJuMWjBC1)nAq@E2r;I$b-F$rA% z%!5l(v?dv@_mLuRoAC_^TP{uU4-kA3Jn%GFWPRtBGYJ!sgSuPstJ{Q0n#vZ zRH#PS1`K`yS;m}-HftfZ)1Y-pbP2b2T#Jx~W6Hqfibh_n2r@Ma-hsd=(Kiq{KSCM@ zLoD3T;7b%iIZg2{1P-0ZJqySMgyu#qj7aM;v^P4yQbkloGeb;=%D#-MRZ!WN1ED6M z>T1eD*@~=`ruZjRF^N_~6b2E84c-Q z^+q?_NjcuD;$3%~z}d9LEa*KF{R4W>7kZ;cTAOzEUF23!HJTz5RJTNvL3QueUvH$f zXcya~P_z7`z7MKPqA8%d_Ug+TX%DxH?o+6l`$?S*s#Bt=pgIfmON}&qjN*VoEvG3y z0M&7jXd0-FLqPZ{atp2D6R4@q=raLDR7O)cAhI7OdIuu=5q->qTF1vjM-^%*P4OY9 zF^S#2d}F&ET`ME?Xe zatdh=Gko)>S$w0B{6&heh^EMbFf5UGG0+)y?iTv4##)VbzHT}Qn5!Vq+lFBMGzO)(#uphR1s34UedF{lah@O-WC^J$6&;0Gky3Vz^%kw^FG z-HbfkVMUWiQ#hgVOOywV|59Aj-O#wcRW!LY#X@L&5`7MhuY{UbPnx+nzgHAFG{qt) zyb^7L!ux}vF!OL+RutJZ#bPKt5^aaVbA^hw?d+urRii01P~8&wKy_c^Io)_kGp%mB z*mZ@Tb%XSeKzB*B19Vq3POtu?S)S-kMV0v@RZF09O0*Ly=dB7=haN^vMamRaIZdHM z<@kx{3#c4FAJj)Q*IIP!IK5LxLlyo-QI*jYE~xA=qI{_Ax25W#4yGh@N0F4$6iXqA zNwf=+*j*`U_h|4}gXECV+xQ4rkdZ}|CiOYLF3usQlwz(I{OQmEN9#TrmO z5}gOtgMGqVX^+PHseQSk&}fPrDBKc#356TmgHvJl(bx(_k@YbZYoTyS^c57YmHM%V zw6^+-4{0^qMcoQNa~1iYfbW#37<}hy^4mXYcFxEeMNv*utb@XlL-aKij&){Q1TfcmrQZS+ktoU?ufz#RWT|*axQ{NZ)&P zcAE^>UZlxqt;Uj_rr6KyiFi1^eE@ZPjhvD`g`d^o$JIuTLroVb!W^2S075Sjub8|C z0BXFBkD&7F=(q~cI)nuC%8pP3@M9O7=aBxpHd>1e`w=8nmPDf|4kMuZC{T@I1N-#t zmpZU-A5OapGwT?cN5FIu$r}O30qPCu+P~|FVFL#Zd1=I8TkjWfffGHUC^Lgp9);2w ztU)R744l-Dp*U?Lrxa>AO;HG{<20E`07ZK3hrtY=QJ7^k#W67LXUW7N+Ry1PKCCs% z2!#}8DNS)4%ovfpU2qP;}nJ3Vx-COK6G{5J!pR?Sx{02Zwa)->p|S zTc`WvfeVK+66?440`)=YBSi8J!$sxSrJ{hQI1NRRNN)8WF%@ZSWOSt~ ziXxw;I15F9$dZu^bd?llA|I@~uPKT=n&KQ3ej;A}`mdXUG%0XJ6+tdd5rV)+#HTF2 zn{ffw<>*hhDg+r^Q|HhY=b`Wt@$QMY44~$a9{np0-SKmUNUp@DRfW}3{ebimQR!EEri2kNXGVf7x z5fUd6cT{)U1MytaWEDhaAOQ`T!QZ){3d(7VFf@*tK>RR@V-`SdmJF9N@|5LFZOBYj z8BK8sD*O9XH3gWRpfal=^ns!(r723FihYnl8NRd_a{$zeXC^BmI7d;H&=lW66(!HxLknaRrVEKO9|@@a}vhyp~G zM*x;3h>Xf`XDgySn&KKnej-a-fbJ_2RkAW%D-~5PO>rG6ACaXUfLnLA*BWIwS1ZgM zn&JkSULwn*0BZp17|m+yF~Y0@$67^~O;h{`orj3~k$XM?NUqQs1B2b8$g~XF;udsn zBFpap)+;)r8e$t1UDl_Rl|kkrvOEEhtIA|OL^mq3%+DzM2{I=U_9xH4=3_v0jE2JD znI}oas|d?!ik~5LY^D&izGI7`Gpi-MRne8v6t|(X=TX-Y;B$cFczzk?fEn7R=t^md zJJ7|5*^Cfbo&(sW z?|fW)sI7lboGO_`G=-J7#)-HUcG$0%lj+;1Fbio4d`iz2BElZk*pp2ED09)HBHR1QcdIO;H2P01?0T5IC&+f2Tc^;XbM`^Jt2iVETzHxF6^* z1ZZmOjK@uQ=!8d4Mpu?=m@cR(*Ks96E=`e)2tFe27wtO%&?GSeJGBgu!3fTiN`xGm zq7EW>iMWHb_tgCn*p3xNa1<#4vT2IC2;d>&zS5pE05$LcF5Xe?=cEL4fH4VZv_(B= z+(g`A+8v5(%uX6RFEw#V)|Zqtgv3R}eV|=m0aTaS$e}A*tSB zMN~{vw5X2bj}UTC=SXRS%BTzfbwyP~Q?x`@VIpqp9KHdNY-Sa&4&O~hR!CE{f-FSD z&7DI(0@Q^}4|UM$WO&OIK>zR zjiz`ES~rnp1i%LX^%bpADKUp3#V3vAn3?qsU7LYj#zzI-&NSDrL+k_V?iZYtwNhs`#s2B~f zIIb`nC8Q~eQktRz6frG>k}*IZ0n}tB@%9Mnil~I9cnYE@k!37^3!oM>{VU2ASf+@I zX^N*IiV#`e09c+NN=qHV*LD3X6jc#T(GjXJk>yQ*j{%a+tl}l~xfNL2D{`<^)R`++k>=7A-5~W5@q1gojsGPz%IDlx#lZZPkJM#f* zLDRpYY>{1xsGO$wJw%S(6io)$lORe<&5*B!`xR9gP4Ne)?0c!204j%@m`!=$ugHRTS;2=Qf39!=2)0sKVV$=QD%pmE=By`Js=?2u>g*So%gH=}ZekV{+i zMF1ZW-{JKY1Jvll`Ouh1ofnW$DaoNJ`a$9);ttQ=ivSH@?J=TH=ft~cTt7N4DdKFJ z8KOVb9zt&W?D+gKp&IGuw*Ly~5 z+BSScVV2PpFM(-~k~s_Dras^q-uU}bVV2Sq1Hp_Dao^|IEr15SjHkIHc;941uK|O4 zzlg5)lcFu5DF#6sCE`}l(VqbtnOd9C!f|yV2H#&R8@iab7z}xY$TAz?HbBD)d1BuF zyKq&Ci)f0MAr2E+J^&~`tlN5EO7i`tPzz~_A)tncEDnHs0CjrdIc8!O-Wf*{vnZe` z(x3|xafj&OOnq|??ZFIBrozmpDTaa>AmaAWf%gHBLl-3n_XmnDkER#~ou3GML)-ig zfV#bU$NRZi^R79G!VFt3Z80259})M5_RWne&|(JN?Q(1@d|`qBFj90`Gzol zm)FeF;Z%g#G{vhBdYl;v3=r%-)pVg2G%LeVwz$km=PlGFO7W^H~$_N_WlhD zvxue`1!kCt`-6l(1!yLpWJYx`%x2!+1JkX7Aami1TTRH;{dRi2F?k@)E^L|8sAH zD`67Kqb=Tq+E2vYr~TUj8k<@7=RBBr@U9*3R*p5fGzGWU@)2<_YTwTL^hyDo`A3re zHz7a{>{>!@u0_Nxs=d1a8rjl@_8!p{uR18%JNCd=nSC}*A$Q&);9a8{nY+#2+z1L=P#<%mA5kb1ovw zDx6k_0gSSD!z&a@*&|03bvaEj5&1ZdQoS0W5TKzva;g&t;P5fE-pXL(wLYlr$EjWe za00-{o3C#ud541VRn}W6P4N$?V?>r5fRlQg|3SS4PbzRG&brzzfrIzYrd zu>;=%#Ph}-kc2gX`#VD%zjDu`Ex3W1pNJb}`@h#uJde6`MGUHW<(^AZa4$0-5qHY= zUDlIrXdmZQg_%QB{0mGkk!2%5ss1M$9@RRoE6i+~;@@C;h`3j_=LUdr?5*{mSmqxclOmD>}a+M z7dwh7ho+bdm6ymmMykBanMGs$Z+*2I?Hwx=MK(>51%-#mI#wz?A2Xka+S}aJ2vPm`)QB04}YqV%V>&)Alq|E z{<|dGH|p2>X-~EfeWs90X^KT4$B3+NOLAbw7h#)+L&$XTaI{upEzk@a0kcAeHAd=bqaEmFvt zXGmTNvXjU z3OSpm*a)(R$a+hXJ>^IBX9sC1kJ*1y*cwgo8Q5+jYnf!b?;X`=48oKbvlk|=5VB^# z6q~?y5m|qdY}ZWv5JI<)&Qi#knIwBbb`n{CmSpGqdY!>qN~g$dga$69uTsc)G{qMn`-!X}N%pVS3x{Ya8Lk|KoJ&*WgX|-+o|k0bTHxmKwebI| zGMwv_FgY~EE`;$CS-+HFyq?4`SdjM{pue4_)ot(Cps2HHirr9qh^${pwdYfPRT@rP z`$mPV(G+_?b`x2PCE5L%ewpOhCWV~kCD{+Mi^%%5B)c~2orY>{GRn3fEvaX{4pnTK zTS+_vqLZlJJ5%2<_FBN!r<1YK2|Cv2NUyvAD5ojTLg3gAR2|nE=Fii^K809DQ=9|Q zz5|GF$=Y{PVdKx%jNf#JzEC8kG(`xK7!lu&jpYMWLnaWQ%j{P8B{ao(@S{Y0M>e{L zd?N$&n!O6Yn5OuW7f%sFzA78pM*%XBAN=qaD1suI;w$jOM0{a3e1J)*D2(rr!Y!mJ ziop#L@%`9P0Kl4x`a%CVQo)w5WfssDUxOYb;_I-%qf8nMvgcR@neQ*=(-arL4G>uf zjx)&yt~;o3^Jt2Tp!kXSo~!>PKtrPrQyv>NP9Hd2tJT(ZTG8dw6k+ImM10%TSET>n zaNP57o>iDRG{q$_y+r&WulF24b$;Z+XjjL1MUhQYd;^7t$Wj~NODgz#L_=XORumdd z@hueY;tWcXfxZT?8ovsST~O#*7fCMx-9^OLXkB5G-36WElETjXhV1Xab`tR&TIaVW zyBm5$iNY?=pe?=!-SHji^#HyHVCknDr4Rq0NXlr6AE2;DsHhKc8G!v#cC*kGgjgq=crp3`vy8(h%UfDT#mXC8{WjX^JaQM2Pr)ZsaBz ztkEZIow&GA1VuE()#`Xq7AEA|x#2PZ*=*+bKYmsug)~Je@(2;}<=oIO0M=o{wgR5$y(Q_U={!hIN(*IfZF@8 zlX}+2P?|$1dgFxi0_pyD=RKI=a3Bp4jV(KE*)&BTP&^+3)sbtFl+O6L0Dn}9UNTpq zYcxe)(A`8FLfu&abyb}W-DRF4%$iSOzZz&d7a>Pd*8%`DM}G0Z$T8|vgqaH|?2jCs zL>y6_ivY|V<2vLRS*!@lX^IyhbZ8V}WOaOW3_k!!mSydbnko+yJ!pxdE2Ak=p|k7M zVT85204in1*BL@f6z2m%K)r+Qh}Zv%r@8<>E(+?CA7thpht-~*hW{7 zZj2^@l?L5p7t<62z>W}cxQ)0?HXcU%S1aryn&Ks}!$cf#!)r`-1_mGBT7_OnQw#(v zM8t76^odFDimu~P*abAjAh3f(@}mjsO*V!q&!-AIpQacLc7VuI8|@#+1xmuBM)aM} z6m}j>@iN$cA`Y?sO$HgEU7HnhE=@56WFHYnSl4|v%YR-%j#)~`<25<^PKB+}6vM!F6LD;He?j(Z!(Kz<#PSo_ z{cKsgNFNTmi-<$3Yd1i(UaxeL-}H#?Nfg*J{p7y_zLSXKs&lWt^sji{7TKpT%V~;N z!F22=6XU6)0Dvo^{^qoBKv9&@6t6*HKS%|}Q~Mz*`a@zULIFilN>jWJMJ$j(2?o^I zVM_Q!&NzdEM-@p4P4Q<)qC^~2qlEx9;tHI*f#Zs#n5Os(BoQJGs*w`_wc?T#&JG#= zlZvW{ruZvVVIq#H;ZtPbd0PrzIzb01QUrxG#s5MOBI0NoIs;H$3h;Q2>j*_rKvRr> zB6yBt34cow3{fJN=y;@tuJWZK$)_p)21$U3KconJRiVJ|jnQ4cRup+O#YiapL>Byt z!haz_!E+%Dn~xgJ0V0>S7zK%sh(Dq5U8<1ai4{7{x3DV}IW)y+D7-}c`GmJ5L4k9~ z@x7wRrYXii;UTi5;9U0nP$9uZ7JAQRMWWFZVH$HnIb8pDbgXa|3pbU^gsL0i5e6w^oyb?r78XnO^k@Y(1^tVYQ{^(uPFuZD4G(Q z;%#W6M3(jdcPllW@k3>FpkJxUsA&FT+F~3;5hBZD0KX|B&JyJ6jPI&=eCP3KH=LAi)n3G*F=< zeW+;iX^KhE1c>nK4{TAcXmHwOxU&>d9!>ENi2OwS<%fS>g$QRF&o$QqMUzWYOoqls zWO)j}nV^y9r*n~_$)PExa4q8{v^)*4SP`MiIX+TE*)+veWaJ^@&r3W@Dl|Al<>}*6 zG#X7Y4H`EQe_G;RTB&(?x;(LC%M?-8a*E!8$VJ2-mbkJjMbMygm#sjG@jKMakIByg z-}$j#J{r$9BW|Rai%tuEt433-1;MeJXaG8Tc#T3SqbWWC#hwEsudLSsB-uy~eWH*{ zX^M3q$B5)L^*R7~wT2IMWuWqc>lH}}P2qtgN+d6EX^QpWM~LKA z^+o`hh4Bq9|0YFIL{n^lBAh`eFRZ-)6&K>ZEsCI!ruY-c zA(HE-0|0foP0z^5@=K(~7uoEG6rn~lLu`T4O(@q=0f1yviDilL8PvmyF6#(Pu@y2G zkz7+91xU=$Sk6QX6=CKv3iBXz63N9?#&Mt;W`^v)krRrhoTm638b^?t#sDV)YQ@Wl zA8?`@ol-<)G{rWE?58QhBFJ8pAmXn+(Us01DWUyKX^ZVp#fZ3~iJfHlV$3%(&Y7R)xFxrSB{{=-DT!&=&bn28p<=34WKLOgM9X zKyqbeE z9}!m)zUu(y;@=rn*f}(XA8aoX7ZKi@WE&S2j$347TIZW8IQ_F}i@l(Gh`1K;lmS#5 z(0zEfVW?>P&lFVfHJV}{_--OD1Khs=Scmr*hSrS56n55aviF1SBH{wTbq65BIz)EH z=v{@LSx$NZ=uRU3{L}d>KvldPordU<-xPW|O>qEp$34<9>pScxK<{VJ!!ux17QKw7 zI0(8uV<{*tM%OKFNjV8@6!)5qQ?xu5(@zy}Jsgr*3993|ouA9VoK zHqTeH{DC>9ipxq=elcxv7_tZvC;7N1zH5ahea$2f%qHPb+ye zKBuB7q$!R<6C%psJRe$^Ad*MrU95--Xo^CJf<&C=gBn2609Ju#i9*h&DUN|0AhKY= z70>~y4e!)_82Rp{m3;I+TOMt390EU)1%1uG3?P0OG80#Jr3ji_n&JdBJ|YXk`c?qM zM~8S`&XtNRho%TZ<|VQ`!)28_K^O1rj@61To2EDkorlPRF6dbUAn*Sh_X6!}6@^Aq zoPxqlWO)|gleoedfMV-TRNmdgF=cruISq-6h`+XVt*7MWSB4KWXOs=FD?4)Lr&JU{ z;Uwa(Zk@SQRNh&RY*ZBGG{qSx9G_8<@duzylwh`tKgsYak}{g&EF|{Ll=KAH0uUcj zDKx4ev{ez7(iG<)j1lpdzOlUfgc(Lv1h*;55}G0eWt51&{Eco;Q1ZjzMuh}+D8gcz z;yi>ABK{CKvNJ(gSug&4DQp!V{)%XeFQE(*@rS`-eBF71_TXQAdn7f^ETk#E0y9Kp z83W)4s5N}-Wb8nnV(f~Nw+~6ie%=Ly;w}V1q8k60mOlFJsUzPWi%x{^*G|M&M*|1o z;GH&iK>vE8hOG@JYSw4`hmnd89m-t`Tt{Kx^E2Ed#n_wSVRKj1-w@eX2(R3>*Lj>F zn?83BsovuZ%bSrW|Nq3?KhJXt-grLtB9@?KXZM+S#PYL1#_pPPZyn_%!A35-$K$Yv1mv zu2V4A;Cp3DCuyy^yDuU&Y2^5EsDDE2-(95&_h;r`J^9}%Ro+AwyacDU-BUfLp!&bj zOObU(>|3OXcGEd=8`8>su#FG-R;ltfN=l~%Gj8;IfU2YZnbK}Fr))}+sx-ysz?|f& z;L(%uhoVI2v_KNM3?Rt&UnSp~z|V+(4`@8fPA>)F(zw8Por0}%e};G>4vR2>|^H(Eg zy^1!&JG1id-{_9N!HF+Oj-EUgJ6(-|CWWof$yz@)S!?kZ&y1kifSI#^l6uz0WUCQ! zN_P{~{`;h{Z;qHU_RaCw$%Hd8(#!$z0SuwD$;EW;BB=hGv1`#iG_^zTGev7_bIw6J zKIDjvuo&PuY=+I9y(4p#Fy%BkGdi*u#$OR8JYQcwMQhR6z5wa>6(zJ#{}MhCTcrOo zMSDmDHNEFFdHPF!po6ply4F?sGTr% zirhEaw*twPhgnF|f=MVuPbYt|%<)O5&c{d{E zzmLPQ3CWemkxi4MyN96qzKY|pZ_%$HOk?*Jq~BNMSf1YE9n`aHo8IFct&NCoH|iM= zkeoX}kC!j9(NM}9r$UF{L!J)s|ls(CQTuz%&K4p4a@`KR>X-o@9Z-DmXX)A5y1 z{~5UNE21l;NOD8^>(jO79h_e=nZ2kDrXE`k%|?HQ88*ut|37LPpPfYXKYA|wcl69l zNHfoALS87j32MJR_MezVMxeWMJMY-H`km=o+YHxt@L_bpXfbZQ+y*WBJyPT*=hLes zhv#p_$I>%L{2<{LX zE+y3pYQ}Wj@V1rF=CzakIso<(o%+v7*r1P-{tYs#%AlBQOKHlxu2F-?-TY*!gFlj3 zO%hSY5}LfcirzAaZ@)8PVo!d(uJ9)$7!z&rPr>KG8iuknvF5n+3Dc%`nDQ>aeD04S z1>2SzKQWL;VV<+YQGPmkPb_>}|I5F$lqBEXpq}wBt$9YM9G*II(|3&5lduQX6bzK! z-x!Q-JKdb{s++-H#fWha&SZ}6Be7|dsqoA=S&_XtVVH{7Fk;Zj>;p3anv6<+GiB_A zG3g^GJgGPRw^pZ{JCkA~J40+W#joSQ-iPzQO6dAP|MS1K7EOE(c<(QabB;a_&W7H( zaMqYGF=gDyQDev9xE%BJFX-^hr(=MvSKk3>3^?pg{W2Uq-3#d$HY~MI&vqSqV9gL) zgalM;jNmiIl<{tW3-vjxm*h(Z?jeLq$0VnmWi%GDA(1ON~64W)i!&~X2utS#IygQJC zWSs2yl5h(T2fmQn3)@R$<_&&^ls0A*%+`AI|7gvA=kZqPt3#hplfQ!x5LCam zUtD$#|E@Od&H7*egTc_fHO`-2B?(uWH2M2?f1bYRKU&+@vbP~2size+oJ%OUMY4~` zI_{nEyfwK4Sk^1optc;Eg4-f{iR8`rodEa{H+#}^SkH9ldM015n}OGYJ^3cdvkL&- zN3M44dtl%@l$C3w_~P_W2<)bpf!+QDO>FP|n)qUn+bX;EnHtyr1WnXZpnr;DG<6;@ z-Ohsv?#LniA`9sVm|n->1aJ5V45g6GRvQtbA zH))O?hZhya5eOAEZXCwYqTtDPY=9c<;z9VuQ81%KHDn*3JTe`$z-fJ@U2EAeQbdPw z&i0s&1&aTyejJWE;d5|U+sQQFc|C@-XF^|Arg@8j<Jh0;l9ZznCm+uZsq9t7xRcuA+GOxvd5%P zd3%avYZ2JS_?|<^8{uApn&U@~eyhX84x=ZbFFURx#hkY>0cF#yZmi^g$2rb^oqi6X zJvl*XG?N>_#AGZp2PYQQd(PC_)N%a?XVN<(IcVKFsqdYoHF>15N_GAON)1ptb$a@l z9=L@R`Pm@qyJl*28#!W$?rxk{O!qHz+wUg0yFnc)H?v^}h?mHU68)M$>;hu&o*C!u zSz6t?QTr*JAk$EcRL&i`f0ov?b&G@$c*P|$3!G|_1CsxJlG@h~&qnG45ca^v^r&-( z)avyzwYv2~AI5#%==09iJ7z)>%!(&>XR>F$A+b{uSWw~P;kXy-Zc6-%;>kTIacPDm zN{R0y`iyd+U{37i^}g0#cwPFl@ALdxMt4PfWz$UNq9tBC0!3JkMC)Yi&dX^*;cGOL z+a~ZakhwobVx5tbM{^JR(b&;(Y|k#Jy~o>+q04v_K^e{D#}fotRE9p4 zHQMTTNRD5&;y`1$jFaA_2d<5RpXuJ&TKk64O){-3(*m1;TUhm%=g(=V|2kW%AuzPh zn1eegDIaKcYllCFTTDUs_iZ=g^UJ;Q_&BtXPsZxTSl*rbqz|o4fWK{^ky?ZZls2{B`60&LhTm zoZcB7$cYcxF~;lQH1-|>r*;AdZRt2nLi=W(BmbrE3cbBh-vf7J_p$q=I74H{^>RvG z!T*x--bnPMtckYIB-8{NznSA!EB*#o{LQzvOd&m)N`CgLN%73 zLBi*ZTHf`cR=1x0e4;D#rF6A^&a657uL|xv#J)--1-~}*Pt1WndLhvj2pjr8Br9*r0? zl4D4&=edpKsw1Y4W%b(c8l}*m%7V*X4p&9p#(p&hm$7g)aovNfx><*ABjt93ULLVl?dvcyuBPp15 zTE8?`YoZUDhl7dEgI^v@V1fShe2mHi66&oU+Qpfet$z`-ZQnS&7^x4W<3bgu1GGwHTy^3@(*t-4kv zWHTh5jWfqQptIm7d)I=KG=d|oW1T!Az2*Xp;vP?87WNIN_4@B?O`aTvDDnEk!qWXI zSas4zcIlk*#>nyMIZzPf#ZR^x%_CL?9ldsz)%e5Il!n~_?5{KPR_KHw~h zY=K=lHI&m#eiiKa)PVWjk%vSpcD=#^EBv`};MJU%GVR;ps5+!`7fwhapW*ofJ+U2z zN6v1+FQn%oUa!Z)VqlHt8yq>E1$G;157hM{d*G=y1hZ+!k(g%p8m@~B9NuS$;6j@g z7@h|gLKHe6MJNkJ-b03K0A0a=6w!qSJz~^r{l6s?2cu8msNPY-%l5~>t*nqdn#m&* zsJPJfA18+sSU1i_uAm~xrI|b`L4scIJ4w#?(a+*&Q3&U0MUq1^c{C->%q0}weef0` z)%wp6SF;_VdP(&RK*mmCm)Hf0e zgSDCKYaVLT&e02CR~~ETMVQHNCUDW+oM9v;jhu{AD00atL#?+=iY<(-H*kvU!xv+; zvwtt6iqH@GjKx@e#3F_r#NHVs6_XUbY9t1(8HuemBu1_qiTo)ee;*UA)72^JgZvuN(XYDOKO;Hg)XZ(a^UI?mckp1@6F8ZMxie z9p_NF;p+Yo!uWrcVenq8>zR*p!%$XTf{ffBB3-=G0}V6BNbZ5;WLK7?cSj9J=NakanC@I)gkjA) zjdVBC>pB)8-TKZm*!bKQUR)#x3H=N_N%oJ5^iG=AqYmM$N5*9&QItJyDOZ0SI@WFEYSrx zMQDwFL)TJzdDoIuu>viinQTue5UxXlpCGYn+F;udbX|`}5#)RHmt9)JjKF$w(tC98 z_$Eg}g_B1!d1gY;dN@^cDUdrfqkTV91i3VmXC(;m%*eM1iPa`g!N|q)bhDy(B!_l# zW`d*vdfyf#CQX_&nnR^osjZe`UbJsFn(g_eTHQKsA6V8A-Fa&vw!?5tqr>%u>A+AD z%{Lqy=y2{f9hmeZdkn`#IO;m~!ci5Wx?nXC-e-6oT!wCLFMy|-^t^*1`GDaX09T#Z zK{Fbr++aXD9?D8M5DbCQ!)DyBh>P)1cKYoUM+yxw7mohphNF~@@Cn1gD;3{KBkF>L zs2KV}r)1P;y0SvOMTYp5Q{?0JD#*IsGb78@;M< zGfT-`p1{TA>AYreBi9vfInCtk1TL<(98rTCzNv7_XeO^n;9{(`-!izNGKE`8Gx_5L zF0Qa*Katz2>n{qmgl6)}1S)%042jjI_vk*NJGx)sj&YXMcAG3)!-7l@=B=Er*o*les z#YyP?P`Vyoo1j3S@XrCM`iQqiPI-6ixN&HetTVY>vz~x+@jl`;$>)A+=6?&Uhc(@gI8#VZsRa)JS_SIm>DJ--`iC0Q9 z`Ll$0m||i%Mmd9@DBKd7$(s_m82zK`3~pe(!Y!tm>`ma-MbS1GTz{^@EuxvcIe}Xb z!{bJS>)WJo3uz{AN#J7a4|yfGi+78{EufjaHGzu}CAbxdRWazZt~{T!uA0`$GdVW5 zHxYcNLocYtb+{H`ygqt&*AXz0hje3ODXz`5Jd>ePDom=4SVj=hGX5RST@eazpS z1MCIT(|SijRGiH21K?E52C;)AwXfp}m?2T{=wTz|gdBu)9yLR9_>UAyPpkZdkh~T+ zZiqP%giq*u8PI;xNaH9TI%Nc`vlankr)5B6w|+asZ7;P{X|S zISNPZDM5lcKVTlnr)fEef)P|df#IKju)l*{t-IXD7xnxDEaP!lP2Sz9e1d%l;|ZNL z$Ja@?zv{YjMjz?XnzRa_<*&fa$5pCqk(!Awc2a}wPulO&9lQGB3cJ$4`t zd?0;~oIf6Lx);I4!VP1XQ1~|2lgI<=TQsp-%8Tz0k~x> z>>}EW1w$LHHe!8+0psL zdavK0A-(&K=r=%a*RWC29==$`HsdqWP+j&-0JYy6IOwHe1BRwzZ!we%BR)&^Xt;{) zwwFBASZp&uJ@ERazRE*IrKAq*&k^5()1=vY4d{zD+$MRCd{f1C zc^i4CxyW{aSK>1aFbbdTzI@`oz6eFw;7FFOd(m_;A-%80a~_-q)yqtdtc zu%W4g2BH}Qy5%#iMXQ|w(ouW9!vHnk8!~7RTHn?W_2I--tzuh!l0Hd5*JV?w&H#TW4`o_ZK;(gSjZvc{dR_lPrkA(6=0tD4YrB8TkEN;;SzJq1VNe@-U zgLRtx>1yOVeUMjcDQN7o|7hWDJcP#cts1tbis%H{(MKtA)L{5Pc7;hYW8YQ4$^eBl`6GxBK~iT12$fbq*EJ(R^cs`i8jX^B zuLD*FD4@xf3lb!CWq{y~3h0dLUvJhP`h6tIq__To0G^wGl>zc;@;3(of~0N?5cshI zI&R4Tso`5pk^$UhfHHvb^qr>VG4zdJn4W~Xk#B_N(&R4!d@%sL)7fPT`c#Yu)T-lc zBpK1PJA^$SKwISy@-yCEf(NjK=z#X(>~>aPxJ7H;(DNJ8YrHgabg%RYax%2r_1#;v z77x1Z=b)T{{yPIeq^2ULnfi6O8oOrEH50|l1V~Dy5A#>+ty+sZ&e=$^j>l+(-ur?6 z!d9)72!5cyiT}5BJK$?DIBoDyxNRuM(nLZ3-s);6gH5 zG>a~zn`7f5(>?KDcqA3jjFPNC$JNNF2k;R9N;2i2Q>OB6mLKmWva}zgP&zs2D`A(x ziBHhJW%?y#^H69R2{_F|%K@FiEQS&I?`GhQ=wci6 zy4$oSJsi3BlioH-n{Xf-;l!J*aS+YZPi)g3uH)PWGWS8n2@=_^-$Uew9X_Vnz3tvZ=h^{WJ9Xf2 z+W^!WUqC|>?$rOVU3)mgo(~^h=*82A^f%J6P-KwME+m=_V7%X!Jl7LCFOkyz7+V>o<=^{43x9ib=jZDVht{=Yu$kvhR+@K}vkc`<1%0K0D>h%^iO zu=^B%xqN(FW^Ol&aFo*&o&0Tc8*{D5hc)~=#(7G=;nP|-^qvO^6)|$E*{Y7O^fo)R z77aYba8$2+``La$ABgmZ?u!&m9y?{?w8^8#q71RH{vI3|W#7VKyaAF~0%!>%7Xsyg zBi|#%m~*U{JIZNVE}?mU0I>GxmHHBJ1h~fFw*x*i#m3J^wA@y;^lL6j-M1+5lzeYIBEi`?Uh#s z1OE)%%*G!0%EZZUPf2-q;$*zGIC}!D7uvVD0x}-`9ZO2d@3bvWsn3~edmX^wnwOo;w(zM*d$wgqrmtJud7Rv^1*cZL$tB_X7Ev9Mt31=38b#N;4 zimWDQQo4M72t6xDkrdIi{EV}Tz&d!~P;~F`THt!<-h)S`qX$-Ked`o$;Y+kFzu=e& zthhi!KM#3;YvI<$8)GMroq%(abE~2&plONWSP38-^e5m?^?G}>2OsrpRJi#xEw^#{ z5LjOxJOtdpXZnkK@UE)ct8nvZTJGQ&39M$M#3q)DT5-pwkpzG znwGmbe+VEQg3jQ}1FnOOwkJ=WHVMkfW5=TBIk&}?Eqij<&Y^87$59ek(^7}_0p7mE zkKJ1wJK|hP&8BJj73U9uHEr+&jGmsIz%|pRO&U8{RyR6UzM|4-T7JU`L}10$Aul3# z>685EsIlD&H){{MSc16-tZ8H4L~n8Vf$OGCo%Y5XsTfb~?ElEZ{OV8JMhL5hSuNWsV=0g41D5*8us0V;<5 zd;T*g?K$wi`Td~Je|u)moH;Xd&Y78G=&6kE4fKEv{lC3N!?KY?sR3Brg!DN>hoR!R zj{(Q07vzpAGxR~-ejOi_N5wj>39TeiYKTx5A^p(YJiPOC`GApiEaWIIz>0yQyaH6S zlcC7gyiP19S&BiZlaM|anFBt>rf;*fe$V_z$Xi@RBucSxb`a82s||dHoa$O|lV1}v zk3=aBF?K@wqIW;Q0oc#6s4AQ=;{}bgg+wVH&Nf2ijGo(ek-brc`6$6l8s{mO$vFYe zRzmvHveKczSAe5K!#&iafF`K?Dg`w{keQIaZ0L}Wfv*8K$R1jnQ!=Eu7z+P&P1GF{ z-;@#&W~$|3BMOE9{|Oxb;Im%e4NYty16bC^L1khhF4Q#7BUwsCpq&r``=kR~fn(DPN=D=u@^bU} zeV=iTh*S>KLZb9I0&RpaXzz!%$2J!@j*q?#*+X-Ris;2caGoY|%6y1prA`R75=3Y= zMn={J|4V3Kp(eE422pwfk!C{rUIX7iCvIK@9NnuF3#tpK_x3N=1l=J~dJ;jVuX)g* zK7+93hN*(QdgYJogN6!qXo)7MmP9EHLB^#Nl#$V|JMcHaaTu8uV)WcEA4^)G^x8F% z7fF;lBQi*cBGL8-zXgt|kL-lX?pdY@JWZn11%UxV`i#s%T(5!U?6MnQT6C|}IMBM;hU1;;KoMx*^U-NS~2Cpb+>6;K<&ia*IoIP~9puA-hQ& zD|JVVm!Lkg|A4{3Yk=dZ@VaEC8~PWIrc>=$s|l?lQF;oI9zy!eY`SapIDsQG^M_~W zBW?S7O~^(Pr5*@z6Vmt2q!$zJ7dJqN$Dk8KPFy;M-l&zRZksf*l_W|}Bi2Po-+N$R z42E2r*(*CONl#c^8t3ICO3%RANl1?|$w1((z|GmXXU*92cbg`lf<&n&0vv>t`xZwP zu?VTe5pN}=?}s4;@E+jk(1-#x>sL)s z`CbZo0YPR$`u=0nGtwb=C<+D7(?oUKr-`~lqVyu7O#69MdIp*S(*fX?^=GRX!<H z7Y(m_&giSw(A1JBy#yNLK|wS04LyY4Sj*j51nNDc@xDl+^fJ7Ig!KLU(VMWK7dSdJ zmPa)^q6s=pqVx)a0)+JaaW?~el!8JxGc@ec1l5ozHGUOQeu8v!*9-V}ws$vue$J=y zt|n1RhqI3moZmsdd?$e8>+b~dSONnP=P6C-ZW5(l2=x-uznPJp4tyFohOl8!UO`bF zs=VV&ecT}2U{sMTWgyT)NT2n${&b0*1&$RJEGvhmT%yvQtB*wBMiQk=1iA_7v$E-R zmis(&?ZFt;c2VP8Ng`ht=OUyZ*lFkpTv?ZZBYX7{7o+uxCS*B@(re&%64DRs{{~%O z0pR$7p@(Ap0Te3PHBD&6wXqb-SJ;t7KQOyD3es^MIH4|`jO^Ag=iLbjOguAq{gWBPOyGdTkoe}ESEltpr+Z4nX-Vwt68r3K3 z9bnDuOP}z(})Z>dgBuf23 zU>XOcAKbS;@@o1VxZ&XZ!n*$2_k|{`mPCm!+bgHAcl!22ks8MXH+UV7UQ07_s9Jiz ztb2g4r!RN#khL0r@8LR07tyP9NaAYy%l^tr`lIlyMN z$b$#o&adjc$$2-4QZ}5ug!F~Qqmdi$OyGyQGFcN@MWQqaksd;Hhk)CC&n)0*-ZZ{h zOwanPnxKu%NtWJ5l$(&g1i1sA&Hla*&4+ES#=DY4X)v5!gp^wZ*F0eLErNA{CTcl} z(mRN962dTl44Mh&Lg0qzVDTJu5T1;oiY?NFRV+Hv3~}!w&OsLasA0wQzHl*%*^gTu zQ-#KR9*NR>aJCcD_ZrY^0Pqsv7%|%84_i^8zR|>4NR&Q6oQ)6~nJio+Hal<=5!VMb z-OziCc*}*F^(~Jd6sl5Fz9WJmAg~g`^Nswjz{|+1jGkH0Fd(p;2ZdtFS5V9_#Fz=` zv4sZinanHMU;8bs$NIkyIrCeCJ0waY;OzT>4D@1y-x<`BDCNUotRzF-ok7hSh~n}6 zMS`@7KS-eAaLn7wFG?$<_4ytr1<^YN+E*q0G>PGmeoQ)Ia6! zGA2z;#9OKK8WL$66#qs5tfQruVup7I45Sxn80cI%fH(Edtt_@0uQ|P2;S-bD z50g&%3@{9O7bWlgiM?2DNy!dugGo2K1miD96(HV>NMY?_B5?5dQ5oR(432_~S_;p0 z3gyS>-$5|Ha5$>M&ukgeZ0>eLg%?bpVF6iQnewK@wv!!$v8QVn`H!ZzZPq=2c;!;R z?MwraDAu#4JAZ{SqI3Js-RZrYhjlrKb@q;Zq=c?3t{~F^_ID_g?FXO?$N1V_Ev!#< zgB8PuDX=!N9fA_CY(|yPTQHPR(971t5Mw<|VW<>=qs({E(zcQL7!;A+yNV>yy(j!; zY4wchIJx28-gg23+X9J`Ng0h%a*Ml9<0*Bl_cZ$mu?fLHprys$bPS%eY!Z~s1AZtU zEFE;Y8)5A0KMx~4B=cVY!0XihIVIxV5%siCp}6qYGg6$S&@M;=kvlR*W@f+9w?Ews zUuK3wmSo8pV9y_-S`Z*MrA~>rfsX6!pD?}axlVzvr4Q^+ue3e28EF!j`!9efY)jIOZ(w1&$&P`&vFnzi?#|WLJ4aYUucc*M z=N%=^c^3c)4xu-}v>+TO`~DFYe%R8y5%x537>}a1Jlzdli0SiLhb_r1-$#xDWDwc zR>-KXH6bHvUeH1`y+zr0X0heSL&v}@D5Ky0PP{8e))-{e7ra={DZqK@-wUT3y~kxZ zzviCLCw$E%StVc6)$zeFbwj|hf)0!)47mk9l^=++F($<#6&;v zALzSz7DG>awAhyrtuCxV*o$G|F?6g%ODzSuK{pxc!LrTHenHq+*SAnap&E7TO7+OP zjDq#p4*=V0)dkbeSO3D*z8ppzq?iw&G#TcV6cK7ZsZ3v`|L~iLQ?QDR67qt!73V}T zA~TbywLYq2LyuZoG_?WMHOj;2J3hf5nfWMQB3su!XbG%iTgYNw|DeUckzFQ>Y14xi z-xk)o#?mUsxD^)6I^b`HpY1_Mz|Ta@PtYqJ1ws0jbdW%(qu_b+Y=;INg=h)WPm@UB zj1KG|@B#|g&1NH+B>yi^#1_$1Nu+?sRCKa;v7N9Da{fvr5*jGFP}6slNS{ykasZ8Y zFEr6K-;ws|!o{^O6u`HhtRj)VqU_;-uCHqL+%e2qa36$4*<#Ih2pDyMHb)VyP^i)V z8d>qeNR2j4+_4^EQxHAec@#>`+j`3}Xml^dq~YBNLHg*fgMhY)GWnoVN~Iz8KOm95 zn`=J-fPOEudl>a4##1c*cT1~}Y^PxhHMzk*An?l|w6B@CKEuKs$lh6%XTUE!>l=6F zdI|dhjlp>sB}&DAflWjzV@;PR_Ic5;`!0*v`few9U%KN1j^f@IaOJ*{6q!^)s3OiPI8jNapZNYIRxKaZ5@||6im)=jIOrM82SG zJ?Of1l(qF)nztzc39P=`u%h7bn5J$gH|O1>%zE6?W`y@1jJnQrm=0qNPd@pfHu3A3c*jS$>rG;ZERA@McjLI(%`^eGAV0w*?B{;uKYWxY( zwwvL?w{$XoMf&eeNw0khy=`VlAG83WxF0^=f5Xoz!y1l8*E$Oz`US(lyy4;vGh@%4 zu%x_bo(+8jZ68EcWDarBUV816rdLen2@9iVIi`8AqMO9^SBQ-I=Cc`Kkc#BDWU|#UuHhlIQCh)^`5P=3^&;B2Ym#%R`Q9-32_R+3YSheo(Wzol@hRJ40!dNqkOP0aTlKm&S8kcW-tz~)>I z1umZYU63R;?WCpQSnmoLbnSDWL`C^t_z>BnntF=s)#HG%Rar?fy-_T}ybA+nm+^-{ z*rmeIei-8IKZyAHdLC*_Vo+yR!x%RT)8h=-jG!!k6m8mMTl32Q6%vbsTLUAF3|v0~ zG~%(taz@}S^N76skqEasYuNAAmgXsOIKXxANf=sOfSi>L9g$Z^2ac5sBpJ7|ey1(T@r{tZt%}X|6H7adxq-oLWNX#Q zT15s7O03%fnq&4=&KS%rDKwN6(+l*xBHB9>sRwqj8St0PZnpBYrLE-uh3$ph!L$ou z(PagAiiV=Yy~J+FVk`Yxg8U;Ydsw4C5bNE`((t!ia4#8s{ey?Mi1Wx}S&?(d7tY;DIE18h= z_Ay*mWjFp|HHrL$$a z#0J1M!F~z$2*YFP1L17H%sxAdefW$4wh+cdTL8u=!(&R`Y**RtvzGQx2d_bmMh6>p zDfe9QG?KzkN7dvytTA*{*c-DSUyEz4#eo#OWqxF6?Vm7;{HYM)1;bbv~qk3QhYdF%jeTd0Hu7qRdQmQ>F9k?I2~w+De>5IaH|9IA;Ss|pcuX-Qe0LobnKC@MfEl#m32G&ANa&Lw<|u*9cfd;Q9j^l!mgRpqfOf1g^d_gxWVm_MCpeB#Gs; zpV;KZQrNubD2TRa<8z@aFF+JYRS}d%!pB31CpE0N0Q1CnJCCZDoH7Ph_Z3)C{V=Y> z;}!Jfc$$Hty-GD8`I*n);kpVBUJI@fpmSdf@V{2h{|A5PpR8K|+xA%gf|u^4Xtb^s z1SKPk4nom%++sq8=@u&qSW;fK--aI9$nV4RsN6>z??Q`&Xb)`B@y9DyffZb~d$5M% zabocPF?RW?rFrsfXsyQIMRu*@2n@u@_?%t3il%K2tmZFBNexXof!A>+#tZ9QSWRD& z66en}fj~Aj_`*65R^voc;`Y-xi9kAvf3mR7hc!5vl&=CzA%O1GGmTqYE`T*Kjg&@! z=>WR7M`9%8oN=72ay@0j3ZZSw$)A#Ci%Ya@sTU`vT45}oNKA-0zpc_+w5Z5BWX7%q4 zdyhdsZNQE^J#oUY>~G(7%WH$?eNFy+n#yv5^bsB>fjGP^98#8>mYX*+hh|opmlB&8 z`-_K{O_hp(;jrTy81=8Ve-w>{>04G%i!Ds;-$57g#2~)6k#V_*#%`5LA1pRdq-~M# zEoSbCdmuCo!IjK~@C2)aD|>NeU==$LWukdCS7vjizw&n-+Z#PGsR_!;^dl^hPYfE! zO}@44l|L=5J~XZqT0vd29+DU^TqH>2-XMV(61AD0;+W= zZWmjJMB1HmkpoV$e=ER4v#MO%*towi!cWE$!EK7CuWHs!jPlT6zj_0s=EFM_z4vG6 zAA8{!h&%%yPzI_tlx2&gjP*$G**me{_Vy%oeB;H^+$_P`ihL^n_)OY=)g@=&%F zd!Z8rP)RVnHEIcgPyvXCme&1H)fd2W62se|UJy{FZ$1c_KfHWVIjKsOXdi|Leyhkz z*Q(<;fQO0&6T(p}tzy3QDsJ|}yiANosZ5gN+l8esI;xm#HDr1*cnorVxlH+;%#WbG zA)v~a^*CfrxdePvF0ICzPr~v*q4-Zh$65K9;SPzkK+SX-;K8fl^cg6{ zRXG;X7r$}2c+WvuUxpV+3~z>e?jRvmW`pPH*xvA54EghOewxJaR8%?wDtGr4@}t2% zubed`(yBK<2Wb2J0akPqjf?9Vn{*S89evl~p(zaX4pbqN(F%BPz!)PItSj^E96?cq zo4=re~G{TH|rxY_dt(esVuYkv%bpEYFAns_XN z^W3$xjdQPolP-5S?z>DsvOAzlw*LrKd{$oRFyvqW-V6`T`w+QU%evgNL}g#&vAPJxi-bwsmlc?4L7oK=vTyc0Kdn!`fcodigE6Ide6Z zBk;t;u>n3YL_^DsKB4{if*V-3`*?w5-3U|MJ0F*2XVc5@UVJ{UbrTzUA3L#mH>p|d zo9kJ!v&R&a;=neuEnsPE-U3rJ5hxRax3Y`GZu;qeVK;4)+sNG{_coBXX=beov0}dY zb7SZ!fUk-UExE~b9OZUcBL^s(TNro9-^))#x^_U>nsrN%o3KDrIkvm`=MYC$)}W^_ zc0mmw6<*$8Ocd9I*B_%&ix>|6XVxuTZXyNUtWUVyMZz+@E8%jp#$}~Q-MkZ#Iu1QM z>F|=9;T1!Gw9y%OBRibelfW*vD_nj=!a6>LwoEeafjzc=_R!%OujLLInll`&j(ZPl zE6J@S{~q?DB)63Ozp{5FxxIvSeq$lOZS+t|r8IldMNninT4Yyw?iIEYV205TeJ85h|Cr zn!T%&J4jgPZq&(!*uX*9q}(B>C%-Xsq@3Jz1FnwWpwvA_{+>gCZQ1)expgGHdc@j7 zihI%T4aM0H1Bu*6X>-2?r9j3glw3|hG3u@R2*ea(OVQ&pI4bhsI~wA$)v#FPA!i2) zr3T7|8DdI4-&W0a44RgqtBh7C;kLmbRt)494J$^4`5hk3v{Mrb%hH6=OGX{{vmR$D z5pt_0&f`!u7&Ky3;gBLe`#3k*Es3bL?=WoHEvVo=j!Aqf!3}ibIIi zUL0r9m0W-^He*yN9zu^ayv?7%TQ5Qv^SmJ&MXt<#3tS=&dbIjdg0>jWp^PrWn2_E7 zO|*lf^KkiQ=0uJ}HODyNvnU*_=_>3Evx+~#0wH>wjEZoLeH$e|9_hXYi|X2LX1fkW z4Bd~El$3SBvw772>nt`JEXLXgS&V!g-VP>a80!yC#^N!SNq zUPHN6GyepN99@>%Wpr5?{-JE`CJ{;NbM}}-WK&ewiR@2`G))qbzDW;7+9vbJ!L)c~ z`(%oYZB&k9n*!KEd8}#ZTZFY|1=y(Bkd-s^WBy?U<5W02P`wMw@^M^b&~a#;#<`g< zM%Kq|nkLA*U)pTdMYt+rUgxO)>kYp_{aaU2r!Sy|V{a+?&#Y?vCWy5TOU(L;D|JX;XZB7ymH z1OY}$*10T51m3x*Svim z-FqV&3*pg}l0^^uGzRhz_oq+? z7IE4Z3axc9e4-WF=WtanX8%Z#Q=T$@4Sk~z2lq<2KwNbzlTR__OC{A(|G=}P$X(|C^Tp;(b_tQhC}Bnk^ErL99uWdTmCKVyRbQnA+I5K zO#^@dB-N14AHvJS23#UZ$U zB0|j}n6^>+DUaE=!4xH0Pc)wPD)Q7MZQQ|=?tpjr=}UINtmEs^Y(E1w$Qm^SBQ5@t z+eeBNF%0e6RE~*ry2-g@6pj`nOFCNiQBzsp-uesl(O<{Eh4ZER7DcfWvNlZ&C+U18 zeTFp6yU9Iq&+Qk^|9d61WP8}!rm{iu?BTVeh3!|^c>yc6L-dLmUGf4pg2J?yDEyDF zLyG6oPMSOqrRduyQXB_&<9?pv-T`xS$4x~;Vm!dgn_-CVI>1wu%+;)>nT)sn)gp3^Q}?cl?$P{QMb!|uZ_n}DHjD@9EOlB0 zO3x{x6vvW-WAU7Z9E%YM)+LKuLDbJP;xsLWzxxdNH)^%|{hIgx`zqwKtVgo^xMcFP z50m9Ki9SE6&Ki-KbrIGh&+$LhlG8-3@4e2HbWzQhV7b&D>wl8fg{BT5ZO&>Y`;dniJo3h56!7gM+sbK z2`!OT|8?lqS#{MyQJ+>K~vjwQ|ATf`*M9{0KKWBMz(k?^eut@F`kPySTKU79L4Tj3MFrX za7|J(glfH%bETaFm-QQk>(~}k2Dq$t$f~o+56=rF8yAa@@@#1*H;Hq63m;MQ1K+aa z?a-Q;zayHKgO9L}!YVNn)VvJx1BHqaB?>jAv1tYQqCi*v6nk?YF71_Uz$0{@yAt|G zDf^E$!9jfwslL|xzUO)Fb`5zpI#dJ)Ag_WPstm}msxr7%vAd7RUE{4kz(rIB?+>Cf zwEqiKLDEORcXJU&1=-^vuZA4;yy1=F+?E}9^G{3 zi@R-MH)P1`$p3jm7A6=dj}|bZqzajI5AMDV{tW2%?pmL6h|{T z+hJ-L{j!v}2ni+g6RflW8z%MT(mU#I&vfqg44*D-uVP)>62ic3f4V>THL8g@d1hxCb<3lYWNPQIz6+W`kdMtYp>+y#KA-q-?3HJ8i0 zN5qEX^(NcZUQQhAAPohWJYp(X#huD8R$Sud#dh2+~4-*d# z*GxcHG8~PX|0tk%%iWK%Fxk1E58hd8MQCat*0?(ud6Ze%FN6k{FKr zJmYZ!Xp4+KfDT!sSo4l@hey39H0~Ek45y>uARpi)`>3Pb>`~8YjpJz&DHj0_{t560 zvv!obJnBBHajYSc()DwI%gFC%=R3++W_w=aSWRL$QuJ|vhT3-lnnu}qm=!)U?Tx%o zLxncyY z{3kISS#ooL$EfaFb~sgT^{DNJ#<7ybaAd*70rgFPvF4A$BU>;JVOqJn(k{t$Ic^}zA|d( zfVyDgNi-~jN=KEA3b(9}%k5fAvQhjMvlNgRyWIhhi)H~<# zjIo#}<#>a4KFo~=6y>F1>2{exm4ssOwS?X&x z&d3sxznxFYNzb~L!W^drW{(=ew}P|Up{&p5auUPwM$X9r@@rluve`9Fj+Y$E*{f-C zvq;lQxG9+`PD63ozh}lYywEYO5(#chlam_Ret;KVu2H3>{!*B3!PL{b2Buhb)ue6` zy85h?uZ0-?1#-Z_XVlq=tbEv6#tg*`Fh}qTibCB8LFC6UUUi}|1~YCZR;5znL~jwf z*xgx9Y94gK7N-!H%#$7r|Ha}kOhTKZ|pNHh)BLy+pTzMMq9wT{!v zc6F5>9cw73gPt~|cI*DE0kc+V-$L|X!IPTkDW@np1qoUS z(Hu1EY3ArAcYG}HhsLw~40+N6X)__}mCa|_?QZC4{eF$-9TKHB@HCwx&uD=208P_- zXNzf!SS3gkX~kBGz6+Y@S`wwUh&EoN=mr3nG|_mASRd`Zd~&S%gj~E#;Rb{U3DHja z!7BjCgFY!9h6iUN0~(6ztFVhN8J{M|H!TVf(vQG^lR6{d`g2}GBHydXPbhpW67&BF zr0buFsSvKeG~U%D^392Sgy@v|f&dZOucxPVqkc)_zMDk8Cy|#BolWm;fEaA^-8-#+ zW|wZy;QDafRRxVjPfIf2kjO)birjM#AQFl2*{F8oDfJ<2B$4k!N!4%9`6O4U`a_&+_C7MohX)C4RiQKHugPD1q20_OxJpgXNTwM>Mh%+e&t z_x^DZibh5KFsEQRE;iE?$n^z3k3_!LkDU-*OZKU!bj;jCZt<9Ly2jT+BHyydMu>{t zW}fw&ob-?242|QIugH=1>9G=`0=LctNEnFyLsF?5NgGg9K$lLyq6sXQDUe=)mLA(8LSW3rNGB93e}fG#sT9kpSO#<`Y6z8#NoE;%iF{|C;8=pRAA4{CKt%5ho{q<+@jp!>-sTUDn1fN6 zYiTHuZi~{ZNtB*L(K){*LujE*`fd{W9z0$`Gy&239RL<4eOy%hNs%G7WYiEbA;_^j z6p7WbxB^JzTk3e07g1<4TmmZqVnfS-Q~5li<=;amCa!NJ$T!|_6KXJY#K)ml-u43& zqT)q%#za#R`A!=yLiL@&8c0d(Uqv&TrqEs*&L1Hw`$rhEyT5@N;jHs$pA8QO$-EO- z$6a#@u*6=tnl{wAcA_0K>?Bilv~L7xlFeN^^rfL_U5s%vyWCSw8Eo4O7p1kj;{p~( zIAtrK^gkf85^8`e3w!$VX%K;JP}E;q`jzr?fJ;p-2cV9py8g z47fM*{emm+xPC%X0=*J4?xZLJyV$fIax1-ecgRfpSOg*QYcRNnuED=o?}e;IYRoxa60S$1LTzV(lbv#{Zvm>vxBVoIXv|6 z9fZ2>EIGYORvsUY5HF;dXk{3CAM#9FFfBAWhDrmF0Exy3J^ZwJzs1-$4>NzerG; z0+%46h%sV1wPyu{`kbF8QJM;`03n|921--pc8Hu$gVpbVHJlz*VgG)r0n?%Mt)}3% z$hq@Jk#l+z=lzjuk#om7AZ^a+Q4@aj0?tF$x}4iLLK69k#MQTvM2W%8O(+tNhR^_^ ze7DrONoaj4NtEa{oQqIXDclR_0*s)`bqI?5CzjOq(bWTNNzaWUdfs6ZsipX|ZLsUtkWQUiF zBPkB(ii*g3m55Saab8uCm}@m86(maEfyBX)gi(UyPZf#jFOeI1ZEF8ZMP$6CA+nGt zEr*wlBdVab+bW{q9YM4LF4ns$qQHF(QMvIC5UqrlnIj3qFY`F)LZ{yUIm^kAQ(iWG zK}zMc`^H14Kkc<7N)C`1zXYN&yKw@!hpLZ>IFd6~!6RrQL#X;phEUIQnndXbcm+6; zs3n}DB63d?M62QApQa*m&Cn24lPFcf%g2#~uG06FipXhU|H{P4@>*0R4yGZgB2oGg zBp!~WNFb|<#6CylW-VOYb5umO`5K~15+x_RTpURl9lI8&h^#h2v<@y#n~KQ%wT7sI zL}@*|931JaKo#Uqy*e5*(^5gS0WS8XoJjQd#&0!5780e6@Un5FTL$!tMWVC=ULKBg+kk#n5!rtcL_fpD{fmmowp&9~ zNuorr&s`kpwgc@^5n1;NB6?%)+^Zro@7EAjkSOhhmxCkSL7)RFA`?E2NLTDGxY!S> zh>Tthk%dHQH@s{d=~e&7ga>AD;lC|5~XT*`8d*50tHk=&TFjQ->5OVrXq3tsUfK%QTh!e9*%TX zKsQt*_MphkA-K4MDk9r$4N)bDk{4bsj&wVK?x={Y_XN>lxH#{rh|J^8sLQ81Nt1gP(ho@*}eg&Lo}VhUQPz3pp6qWL>3aI8hF__ig*{uME-OafL1LyQ4k%2 zi**tw688szDH@{ksYLWUyv!U$d<-;AMdY8(iDvbqw#cj^@_nTtswGkKfyg+MP{hB1 zEab1`$SaE+oq$VFCWCUv;;}+d)gcn4lkf^~6!9OR*(xIUTtRdSF8;YHBG&>9Q8kIu zX?XcKikJ$tP(|ciB#8cii+7QV$Wfsosv=Q311}Fp5oJJ2R7Cb~1kqWzxW7>m*}l^d zRgx(A;pO5e;tQZoGVmBW`~BTf<);&yc`@wj0ak!A~LNOL>J&e$&=8exB%;gkGIJDB1hh#-sv)W+Q3}Az_!FUs{{n3z|4==u5=2+w609Oas2=?cK~;}Pl&--mz)=Kl!2@m; zk$a~gx(*lrP8E@BkA|q4M5z{DK8_;HK)fW*U5#7LlO z6^Z>fk(_=kqbLZWmBUN(**W&xd15e3f*qPuXh`c*`M^BSV^3q*7e zUS^J>-UGTw{`7zVjhg=wCt{AbWc|yg%bZC(JMaZGOn;KdhtyXAq^M-np=;!>5P7eQ z9Fa@#IvJE_5S|+lRCS0%NrG2^qo^l<{!$USZweyXl*fNlMdZ4pA*v=((!z7w2RZk$IYisDebPA-o(MMLh*HT}5P?A&6q& zVxOTRGFmi5780dcc-c6L$^ep8M8R2tC=M=GrXmW=))1A?AtG#;ly2rIsyEPF6_J0Q zAWDFXX}*fcw@^b=OQO^WUPc?CsJDR@k$)Oa;(x2RgoxR z_Ex%wqo`MbeoztFD+N(=xVS4-M7FgWqDm5_WO%taipm0Vs)(%X1yKvQIM=I)%$qbs z6(mY6;pN~cst3?!6_LqBL@BS>T`CgeHVuh|L@5O%Hjbh)fvQv_!R;b9t>I$bp&|;n zHALmV5K$X=nK{BL2CP<95&3rsqPB1`?N$-_e$^1wk|-JAW!y_BYA}$8{6lqUpCD=n zm*74!gz8W=1XUd(QF;Vk0gmF)JO&PuKRtyUg0pl;5IqVP{~=B!o=>`tXo#vwlpceZ zk0aW+!go|f2JF78t*BHI}a zQ6-5|D!g1A#iM<6omCN8&k3T(;o>}}A~Ijp5LJ*Ub%K|Jqj)rrj!P;c(-lGV1YGP_ zR7A#W8X^mc(v$GAaTJf{(RN)$6s#3QX>hUrsUiyer6DR05>aP(nK_C_^Ju=QBJ$r7 zL|x!wx~(Ge-PI7)k|=eBm+>B)* za!l6{Rgow?11}Fp@n{}BW)+eBD?!u~F7B^XL^fGNR7s-rEWBJC#iMz2%~BCrt%B$| zxHzpUBJ*4gQ3Z+8^YC(T6p!Z7F;7KgT0lf-j25U!jEgiR780cwL1N=59!;Zdv5F-4 zwaCp&aIsdXhyqJBMCIQQ(aZ2Ma}zwy`d$#F!zK7V8A5gF2MDSgO7TiQ?UNjuIbh!k z1@cWBpkXG*MiRs0P>VRgSkwIzG}t7&Zbh#lD}%1}DrWuw`w3WoW-IV_?7E*RP>)*U z2EcX~G^3Y3EnwaWxjumk66tl6g999wV;3~|=yQDn>6ttU(;iLaJQ8WXgq?#(fL}#q z-$8G)*FKcv#~MAF2n&fcX~M<AA$y3y!Gv$ZcvWQ@2w9) z%pDSGl7i{55^Orc+I}P(#`=zG9BWCWi4evb0+=ymJO+U6p(sAWY<|uST%{Xxs#886m9_W17TCW%&}C$&hwD? zR=QL}>8HGk3~Pm>C1W_MsrLc^vWD-9(WKo=|5r>3t^qRAt&Qh00DZb0^Cij!{9jfEfR{cetu45D^Sk%LebMa9*PhfwE+GJP}H;CA(6hw zVKM>WQ@^y8i*FKZHx$9f$*N$=ig&6e_#%n48&i;gKC^E&YK_NC!O72eLIpBE5bvI; ziLW7%w$t+y&=29?U2)A4@lPTjvmS_d&ep{5CXsey@)FSZ!PmJ_!1F{rb(-@Yh_^4) z#BU^#HfeGb&=14sgHf!DdHi#@xLk`Lh_^1Oi>F=amXk==rIUbeaMrWb5wZ2Ta;s+@ zcBrD~*G&;IErX1`g|K)5(^u#h+P(29oO3c#y*937ad~p94z`t~KoQ!$2f#%IZftyv zO?UB8FqF3g+LjS4yz%6w%|Lbk71X&Oprd_!b5ZcC*(Z6jp}Bbtba7*_1ucDDumG`G z{_6jct;~}();2$o)jjd+d2<@lEF zz0jad{`=d5u_ZC~utvG=gDO>V+Av&BN_FjrrUiC4&cT%|Ho7j!8=8-8k(95gTdU#F zP6>$}fr;DBgRJ!kIVH+`h(d*>K`-R`RbG6!bSxzD*{HVPfw1Rr200rt`Ijh#Pnv25p62vB?VPP-wuS?W_?xj1}f@BTHh$wiG z75!6AYHYp?MfA|zkzEjt%y=%d8UK`%8$S)_0NL;~;NL^gPX0(f~i|6=Vv zmQy6hE%pljcJSPSNh(04^W4_N`0r3m36-J!F8L z7D0lTQ&a!diWpu)!omhpKFzS=izv!>5pb4faCf#SUvAPb8y@Dbpa@6NnP&pvJ5Xtz zyYYSAEF|*zQM6g{9TNEm!b~y{zJE+tLmjP;u}=!+wt2?cFlxStQ8Nb`u_xh0g8Z9Y zK|&95c;-WiBcY9~#W94w0`xxe86Ycl^llrwjih4zi-?UrOyK&ObtsbC_V86eBR-5`;4Fi{#tbCmNE&H@cPKot=7vi!nXN#ce=3Y_9Rq;JRzE5o>K^hFY2t=2T9Hwj- zW&MF&E|OcdbN)aM|3)9P8bJLOh@mLqHRpBg%H=PU5-|{SK#0-5Uzh`f<45*ZvD{oT zIoUspVI z)4y49ux?@Zi?RPrz{T2>$WJsf{{#a@Wa)2a_oc?3{k;UaH*JR&3;sfrcrir6mVLPV z@R-#Uc)ib{Rq(GPGI{+ZHN9i~Z z0!2kA1nIj;q^%jf9AKz`c6|_gxkGHir8i>hX*{=A@1^nhDemn*8_Si_coruRX3k_oU0}$u{TGe6ZU=1J{&2h>7C^v^-@xM$FsE~vD(=&;R3B0GWMI$l-(kO$HZbr z$?ZEXp9F*0-FPFxaNNSU2}G3)%_&J6f+}X43d-Y&QF)rl<8Ly`g$VS!whMYP! z3)-QLNgY)DabA&OARmW%z7yQzKamrf1(tDpuk1_%zQMrx-7C1g%@7qoZm#_+;Te&d z-LG#J%GDt_{sKq5Zxt;1)T}HRoU4W5$uV+5g13@~^vTRb>w?ye%B@45iZ%w7Z7qD_ zQU~_QFm&tj>{EvHLH$wI>jaApEQ#**@Q6wsnDdE&l13xP%ijxIl4}!ev8l*@mjT%Z zkvBAQ+@aa0I6kKf4lyAIo<;Ld+}<@`m60aM-!^zQPwkgqG-?dx!jOUG>tz^77Vu5NzQC|SQ1KifWSe5@_Nd6$a9w-X$Z-U0~ zZxluF5FE5c;W;eq@53$yj6A``NDDJ9oo96PiU{wudOd=VShV z-dAacA~YZ{IbGdYH`lMH8FKSNnR1v z#De1Dk|Egd4Hd!9{kx4;`4{4nKL`KhI{&^|WqCvCPKy@(@yYxbL^dz}KODE~BAjDV z)u+mOS=dwmBPX#2^i~H7p`p*I;j$+7DkDDj1YQchsg@ z9^UaYRjx1qvHuCj__|zW_31a@HEMaebN7F%obfQr7KC$)R8g>Em0MP6ep#VmgtDDu z@TSOP+JC9$+-5KT7h8b_?g-_7piDI114UG7_NXF$(fIER+ZqZmjbl6hi*tj9HqnTy zZmcTxamZBpMXGd4WmhhIw7%raUL6a9;Fs*Ju^1|#<>g8fDFYMP?6Js(d$Le^N$H=$ z&W**wVb?TLc5LOF4(`O%zv1IV_!yGmwb!!WG-UO~1>&3`qCPev%KH`je@66Y4vSE( zg|d}L)`a4)x{FXWz9+yfxvi|>IP7p|nhD62clZK<&S4_R&BsI5<7 zz+>muN2aK#r(yW@U7cTcMh2R&z%s$|D_9cED`1UE%^Z-C-4_kFf2FWReu1iMa=;d& zoTk2|ndxZ#S8;pC>8dnlB4exJ8IL|9e>9dG8L(j7&=r?prEoT@oGr-bnunZG-#u$Z z$}XfV1u$vm3%RM}UN4mQN$KCf8kIxo+9Z@Om&*yszReGj^}xAy377wni+AfoF6iSN z+l0$Ta`99>kL|aIeNcUZhlI}<^06L% z*awve%`m^p!OChkQ)OANE1GwvtWx$?UkN^@rdIEgipB z)v#}n_$Bzn*R=ugE$)pMtXQ7l8=Zq_+rD2yhQm&eBw(PTL9z*OHxp?NZ7 z<LOUw_>3ZK@&neb_n+Gk)N>{w&aaCv0mR|7vOFpFK9 zOoIihP_~_djT-#35!^5}y)?gQsG&!9TwJcX!u&rlOTKyR<0;s06fH3&*sW4^9P80o zEkty3>f719M0ePyG%t@v1ECHPEi}*PZE&^nEQWJpYOjJ(c_Z;??j`Kaspy()-w5S2D4V+MJeQ*HLu%AOlewehT*i(}m7kQ%D}=jY8aNy) zS+{A_F<{vf5f?%kZ(jut8uDUbYsAtg7!o(A4rePWWhGlZO@2WNt`Tw3(?Mok%UVpA zQ>l67WbcvEyq*N<8Vn=;L z?}4c0-mQY8kr~9npIAFHYO1G7DE|p%LSQ>5?wi#gNACVvSZw6(ce7PyJdJYg6w0%t z^zC9nv)oB??h(otXF%!wmGz&2=EULQ$~N0o`PzkRcOOqeTn6?7B5*wgx~ti)87OJn zZ$cUS6_l<+to2veD9?IWDDz0^Ji7j=*$W*l$yi9edu* z1U;HNUXuN1LTNk2KA4H!DAC;U^R!!)*`ql5XV~JI@)J_vtcW>FG3IkDI1_^f|9PS8 zYN1ndksnqjwy32RPFRM)A{no+Pb?VNqfMhEI(k$|97juV6@l@o@8Gim1=x4Y@Ot_{ zFnF$W=O_26oPB8jYvGJ5FnB8jc_=8Q}eoZYH)t($Wgcp%chN;&_tW2DbD@jEZL{C z515>!GtN-7(@1OkiY;VviY_=)(H?}hu~h~!hFXJrrDfp44a`!EaaJ6U*~*Wn|J(0& z@7a|)egAC5{2I({OmkswlA1jz{mt~(3{Q7`<{3lghgq3#Blo^}isNKBO2!3jo>flP zc^4|$Ur8IZvEx?xQJrV8qD`3%ZQyH`HXDWHULv&3PO47gRb*i)5^c}A&6b<7DYNCq zlFQC)v*nI$eBbii^vy~uMwz7bEgF_zls_bg7GgV>DJk5c6uiq>+#I=s&aqO__Mbzi z_IrdkOf4GTW26E9;b869#%2y~cHBR}(jfIs+>WEyMb~eu6oH9nRav`%mVFI7Fh_nw zXI-lhC(K2+<#ZxECROC87tfD*z2fi&92z+`zyZx#1`R7rn}n(Rc@_6fWM(s*R6PM2 z=`1|nsp|=hE`@R@C?(rgc66@XQy2V6(LOm3T5A=1X&!cp3~X1lM$(#pW;5o=?R0*( zqTLN`3)4=d7q1MnG3+VGFT!1(ZqTxFrQ)N* z1$lE}-Sa#6nxvw+>}%lP zUcs|iy5doD(O&X=4PJ(@Gnh?3b9!hTUe-Hd17_+p26eM7C@JWUG07cb}P4iVrr{o#P4sJcjANd~*!AB1g;2Ks8cKgT>+&_8>Z3vAo*$9YH-VLYjV{kQQ7G3# z+0r}d%EJ#L(Cj;=2&X%6YT=m*rv(0xVQ~IuWd%6~K7>It$k|`20K41F22{w;QY%Qx zj`aQ}^t7b~ipw<<92n!57U$&RDXn2-4qi`NWx?PB!=uhw@Mxj&z+N7ud3ZpRn@9WV znXSV6i6tm5$831Vrefc#(bz%6z_%|k%_WD_=Jt6!t&puZH=>O+FTqFyt>Q}jO|mZL z1a#ev{In$RQF@(&w$VpE<|XXj5`6vS;!^nNUP{0_fjb0g0*~n%fP`WBrG=m5l;)+4 zEK#o9Z=uFPi;tbB*OExDYmCbPqC@T|hh?mAsobWAbvg99A+*uFmms|kz)pzbyVkFw zuFa%vk@BI;P&rQI}6CC?X=^YJ%)u@l`KDo2(oHAji>fUItZQTdkn&#bK-rR8wfsZ2X5RFtzQt=E-Ml!tMT z;1%DpC4I>F1lkQUQc>D|1<<1bK}2wGDB@+M@Iw)JQDOCnh@^DuKA;$sK7HRD-?Bs` zn&`dA8|_(s(Jm)H<3C7D^r`gFX$&!;moy!M5fjXm?`?EbzCY>nvgf~*TeUDA(U`j{ zW;D=6FuxY8(U_l7%%0yvDPr?YUI<41KcA5hI1VGuLe5CV8?CelWKH}h$$&hir2P^UIOK4g#>aUMOiBjcpk`Va>&t^4CeaUF zlI!XNX;`n5H|-A;Dm}~pr|UZaqCS@Yxji_r)4>iHdyht=#&R*`>9fWXV>D3{Uo_9C zi81Y$M5-JD0_ri}I~#Uv2v`m~cI;q91w~XuMFlG=;{P-IJ@Aga|0VLBotd58ot>R6 z-~H~Y%nqNyBA$TgGO8la*cJ5*2=#5wN(MD6V80AF|1#;@-`Y;bXvXk@gKQ@~@uE?` zh=Up|FeEbI@}a}CCT;is%B$aH52?p`9B!6S#sruCuNQvh_U&Ti|22nkW9YYjAM$pB z(sG26!?!2CsycVTA-DSCpkkyZ_xseq+wRa{1U2j7?HH(G%~ab-6VcoYLz%TQV`UuF zBsq-G8^Qp&{M-C#Y~-KIb!flg2wPv>s(S}265NDr8<=^jp^nqnpO>d09Dy)4rXjZj zai=9-?T?2~nnNu&80(M7j0W*-?rw5WlZsq3V4u5;SZ1xvT@D8|+mLGpT>kaT$@=YA zeTYV$KA%hwJu7cM$lf#74I=XvAdDCI$j2`;CjT)Jl@|}p|J2)dRGJCIw>dk= zK@Fz#nGD$HEO8OD@+(StwA3yRYG&<1MJ;6lS4>aV{T2>tb|Z@n*vnY794PfhyA2F# z_9A}_*t5m10t!j7dxGt(y*8T^hw5gA0{V*uI}V0W>DsuZz0u(rm%=8*q{UifK*^?_Y|PBEZj_slZ^G7 z8n!UEE85Lg0N6#VE}r;t9axcY#Oa z1!y@tRFTlxZ+^dEW196mVD3_A@g}2hr+Dr)z=T>94n27Xd=3XSgbXrJyHZ&dms{`W zi11m5Xa}C7lQTFrzipSX4{}hm2njIokJuZI1FPQBw~Ik`9~lh%gEQe2wNEzI@0WfW zRJR^@RrK>uzuT5o$pXP@Dp2|c4re`v$8dCbiQa~(icgUP355c#p;hE-(VEf&Rn zxxaPW%{!_j2e^&E0_Ji9a9b5M@fW`Ai!A}}sgN|O@FAszR#ByQ0AN>1zp1>rJo6qx zR>A7t;LcXTJK?&DK&-01j0aU?bg{;OJ1Ar#pJrM35CE!1-X4qmwC4_;yCgMo#qI76 z4lS&a;Uw}NfhdPAX;0`FGW}lmQ(&}hIcD;6H72_YHKT2;F%O^=rImb%FR9*UjDs>> zRR~LXT{UJ0Ys@3aP&vo!&M7E?G#N2#r3IB#pkhNP4ycC7AwaQ)lS2W(^G+E*6E}YI z%S^*;ItrFqiQ%AND8M6RS=7J?AgnG~y;AK1YqFW}PIEvMO<}ENk$}{#S5Z*_`2-_{ zfm)L$PMOY|x7c^V#TU;75{-a&yJE|GXbdyohy5@hbW^lYdK^vOf{iqWc}#;P8s>8x zt7Aj+Ly$DBBYoTx7J#6gG-Wz>CIGQNCgpXkN28}OA|pq}u9Cob=IPXqjfiY`u)I*p zVIH%WDk@J0)PdQC=Q;ArVU0h4g(?r;!elJA;VDIiIm}z73zsm@Z|#0ZjU>F~>4W8l zJPz~qsd>u)h;Hwp-LH@=P({VIKkk_L_Y!$s38MD*c7JeJLU~(p$wuZHpd8iqkhqqr zZ9{!!tYaMO7`3rMmB-ujYD+mf`4{stMpYl49X+)(in32X6nyv zr(#}<3Q0v+ttj3sw3373JJd!pLmKSjGi)uP72AyOiNtMmd7H7_tio-eRR0;9wcAgh zGM;BTX%=AQ!TZBM9yJ`oQR8VqsfjOOQ1A!X2@JVldC7Ved+82@t%-Z0i`$7{Eqq|@ z;NYhg=}T0|Zsw7_Ky}!3=$^g^d&3vWA5U(+YB7E$Zcv@c$5a-kGq?2myjQ-AgM!b| zH|zuCIJQ=Gh&1e{V-{oUz8U+0vnxo#0p|bp8`K{|QV?&D)jyF0{;D_d;9Eg~hv@w@ zyh6ra=Id$3#toFiplNa8BPy0bHQOG@cF|!nrQz)luK!sI=P>oR+ zF>W5E2HSZp8Qik$jnN4)a!$~y?Z%J!&d;Ll#=6?XQzhh9)96Qe zdvUu?`sqsM+F(9+ntJWP7UH~28n*+?30XGG4N9}rL?&~$RTIMikX8b+_HwVsW|0}P(8g5pKr~wg+IOv1#>1-Mcwm(mr(Go2ID44tn&nDGu)u z<;B7m6uH;_BXFi=cuJj&`K~Zi2efatn6T*stn4K zLxDpIJOV+{4suY0aM8jzemfpRB!;UzJRwFdc5zUIf+s^l+$U!kfOEm?rm5df`xSjk z!W@MC)k(QJN_2D}-+j2iI6V>+ZMXN~gq3K?MB@({J$lbZZLvq^9|We&Wwud6z!n<| zP%1$tzmkI@9LXn3h|j-G##ssbjCGqD=G(C@;-D~qHBmx*2wvg>I=#>6+buBOj&%VC zMFdzAB%}pv0s&XEqELPvJ0LTq3i<6fHt|LpSecm=noE$;zV#@=r-f0Z~R7lHUL$$PEuPhL_!tI z0ldd@J@_y;_yuq6e&*>IZW_lN9OBY9a)jodc}Z$k(1!4p3uh%QS&H&l3{ifv#`vkv zPI;sy{{wTpMe=59d(haxBXf(IiOQuUj19&dG&XOOupI;(qrmGw9@0QOt#Xo})ASvn zItDbI5di(}qD_b)V)s%uL=I0*e@ip$2P`dvzr52g;-J_H0f`dgHyeS6fI~vuf>cAS zSRy?LzS1M0`fH^H(wB$u&IR4*ltab_ZgIz1^ydy^9J)L7g_cf|3F!KU(?H`ZNf`P^ zlYe3t>8EBB{bS}KWHb9Ly#S+U=~*yV@7sM0x~Y!_e?APgbAehOhKS;e{~r+81+RUH6nP{Vxz$fI9fjpKzqYpB`rj-6qHn`0nLH3M&RVA^) zGMQL2ZQh$lbS%SI-#akqG1?>=+aTWJsp>vEm|h{3&oje7^LBz!VMDtt%5ZB*Zlff{ zv;P@0!vLH#ApW#dpTj|M7tDncV$YTyNxvU8HfWR=1)68&s;G?xu(P6N$M8nx_)(|? zz9kF;_&WsIW2C2u~3qZ6T<36}Ff&*IXD9=-4r1gQf+V{2E|JDehk(4b@C5w$N%)rB;1jW=CTSXs7rlmppRP3ysN>htN~Ox65{K&8TNqIr z`Pm8pTUmyER2j)&0ZKb@27FuwgVJ$SEKbz4CYgpL?=Y2x6sAcbpZ6PBDI{1#zz{Be-cB&$`xnHTGI@gE^vTo5Pk=A}&$OR# zeH|)wH)&4d1HSA%EczF@bdXN1fci9ZAEVTM`T#(D#^j5STGW1r~t!gFj#zW&)@QqEhMlnVgxrKEbz9(Pj37p1I# zOJIx5W;Uc2dkFx_j;~I>^_zxE8&HFnC1114;4@rdJ`~N60|0MbaA%+NX;$96T$T3< zcmuC8FS@FZ?vCY*r3EEzT79b$oUr(NF=5UZN<|t&qamc?}TZOj)yN;eb-A`?{ zl+$#Mi-5CllZkb{yt|;H%6=G+@1rK5^l3#j8U)YmA`q%09UdvmfpYRgiU4I+=0i}N zL76m7-oE|_L977rvV!WaDwY*$A%l-W^ljsZIX{2Cg+0OW1NQceOHH!ynm_FY^~y5({x|kjMd}qM?u$mmKU7+B8HnEYchIRT zu1%plLwQBiij1q-cfb{NxRMJ**2~17Cr$gdCn`0F_GO{;2|-UVE@%B)O-t&gECg6} z2p<&+kWW%j82ATg@oZpK55PT4XgG8G!VnDroMvD>0)DkH!j7qogM4IyVa_au&!z-R_^0OoRxem_i~V*M68JH{?X5eGH(VUiNS>Sk#y zFxBN}JCpyAiDb^>^xx+G<~)vrcgw{RVDp^M4Bt+~0GF5ZGK_ZoIULk9L;)qhmKqOC zH7kFY&Zu<7F2*?yYWNkj1gfLS=9y^hS)8rm@I*>0IUZ_J8(!R7|KRwuH;?BK}{QQ5)_pO61#i2RJEc&iu&0PJ8(ti{(uef;*Do4lQBH0z7K zCmiJO6SMa)zQRZ8i#Vw1fI{pA;PhqFCVa!#xqS$zAKc$$kXK`i8L)Ff83!4I8Tc$Y zL3TjP%3+ifzaKz@Et>TrA}BX2SdW3AKH0`<^#{XnnZiCH^ArFl{STABV-v>LTiHh6hC^VinaqH$ zAR`NaGk@VUlDpmne8dHodP8B9XPE^ZQ~Egojw1&3L+7jD%Pr6wdz5&-FDdTI2;CYGK(n-$@ml(GXwlvaR~s& zzC+p%g!&�RgbJ!pBT!b9n-wX2s&;py8h&uj$VuUtKihyl2b@UzYbAfOaJN3v_*~ zuX<>^*)Nz3=au~ufaAzdcy~cEzRv=^2^wr>8PoBWBl9(YT6`VQPq;;KqMy`kB0kmv zV?$U=#v5jYcghHS3bmm2I(I<(NC z+G72Z1Kh0A7|`K+@=0x{Av7By;Rm(F8UU%j2)(_2B?tKwlw<~~tNd-hnU3`mLnJV; zcD@W2+d*jcWn=9h5~G;EJ8EVw04axetLPVSkXvg)3YWk}9Tue%n!CxnDHA|a3b^1(1NK2H20uX9suLXg9 zX7YLxZ?Bsipf<1sEJHv_aC^Ms$az%E@3w#(ASsl zrH+hH(ybiD`)L#qUaB z(U1t!4c+AQJ-$s2&ssmJmd(dzTy(9eH{tKK4JtiRrrMC*(OvG zk8jj4JY}|60M7u(gz}zq1T7M($XSKqY(s>=QjP#)&VEVJNT_bcHS2T0a2$-C-n|WY{I}e9Ud<|g!!xuxJN!V zpXY@Fb%8Aifu!>kCO}k3s1w6t2*|>qg(|xBx;bC~zUO z`Od;^4-Oyx3u!L0V=rCI!OE8iQA-e%cRnaf0r60^IDt8=_w1pfmN6cqgD3_Z`HpWa z-!kmRZ)!PJ{x@Ti%uN~-Jg`gk6TIM2DVRZwpE(6NJ;yXx-ZpDpRB@OxjZeNRX1qHK zs}QIzlOxIHwDcx!olRWMQklwgP!>F4qBX&TOmb(T{Eu@oVWKKFZ#fm+L?2ovBXdMP z6on(>D;qVp$_nzoW%TX3Wd#dimKylSLhx2c&XO{j;=vR)UXDDyB6CG6X!y1u(oZr9i~oH`ew0sg6_v$AYpl2m;|E9pmTzB1NOyW7UWVo@T^ zx(y*|i4{Tuz{&ME1=G-Jyj*sUNm57?E9u*5GqIiqvq+@VEac!?@+*X<^43zfLStuv z&+(=e8V8A@b+ot8=vCja9unL*>*_LvgTpsi!oUb(<$8JuhI;AD;K~fV?}m%;-Avv* znzNo7-7)%llrp^<>)>7d!$><}1NFOOY&$S>0|?r0c{Gy8pq&hLuSFT->u`zM;vdV# zx7BF98(CyUo-n@03z`FWu=hVO$x?d9cu%7%P65Ys>R1?DkG|?Y;~i>Vgt8T$q6of4ot@%Gh`d`W z!@S#)!Ao;nrQ@)#80Yx@A{jjgKXJ5-d}iGZzv3Kkx#CQNwPIO`rB*HKuMx$M>5JOb zUz`5qB~5pw0A1memwejEsoK;4bBwsBR=&LFDqnJ`$|tf*X;U5gNn~R6rw#-pytEQB zUaEw2oKe7p*fOi+w6aRcPEat=+g)k0HuLpM3UZ?_w8`aGAok5m%5|g0+Wi3DxKU?q zVBjl?azf!#gDB6PytG+CuV|1ievJqUu`KhTaE)W^>{r_O4ZnDbj$x~ z;E**AuO5d!|7=w|-+y839vufJQQ))Z0o+0;uHejjoEqH(in3jcA}>JuK&>DkmlWIrHHIJFaN9#Y3}Y9sQj&rQV? z9Zu~zkgO+7B>9oqKutvC6WVJaA93snWg8GN znZh!Ktd7EWP-Z%XNcIJ_N|}~*`sRs=b#TMrTY=oUqrv4ZgXg{F6Sk<0x51e z)hE|zdXL6M)4PuPSFg$_Ig)&|3tn4+jpbJ0@EaA-T%&Q3RM&ZS&}(gt96=>X^s%LF z6xG$}E`|bioR-b6=}qk-sRIQ@Q@B=tcs4bdOTD!b;jby(K;F8HaPW1bK69xa4W3KY zXz^U~)y5iBvbbxY%(>K8+=?Kt807iR92y@(pL;EcLNuQ3t3NK*(`Y&wL!Z_>JQpOv zm{)VjFP0jLIkD6`7Lg<4C^DADiH1cx%jqO8n=;Z=$P&5 zVoI7%Ux-^vsM-ShQrufg?UzzRYQ2SOQ}0x2LCNdMv8F1sBmuHU($_1=o31TDamtnf zF^p<)A$uFCrzl@ee;aA6Hhkr4+MAAQC^b?a=crZ8rXjyn`n0mJj*fccYRT1rjv2|7 z?ply8-qgD~>KCn%gr*#Hrs8!}gIW=6b#J09lqj-353iNshL6@Ff&ZGrdF8_8^JQ`#~=@k(Uyj%CM_+y#NE_SQm`OcXQUmSjtk>99fXdu{hL)~`HgeBW z`AUROo+JG#`a*Z_JRbxa*uYERbf;^pXq3RIBHdQgaB(A>Vph}Fb?;vS zx4n&pUzP%-yPdw90_r|vggsB}6`=a7E*YBfp_n!B3ojTuic+8|M!3+0HPlHLlnd+# zl^2EXLgNxiCzf5MNr~v460cDbp4ybW*A#Ptdh51bm!kKqq@MKaTB;-V=96J9vV8Cc zU0qAP#fh8LcpV(Y{##%iNO3XbMSrfN?%GQQuW9OOIODwARKAYwy^!?lsju$A9dP!d zeMa~z)NU>IKlOA^?*coRemqURsm=!Uhp+FwCN~S|bwx#>3@7~}SVM&$t)}``)M`y9 zRL`UPtnKYqQLMjL6g^V5fj=&PY06Un2dbfx;I3(B=M#&YF;uI`jUUwQ7_R+V&q z8x2gOF}~>*P*5)wwIb_BpJS2KdWX_Lb+x5QPW_EENf#%#%i0xpx2w`F?5LW~1IE}m zRpXIaKSWMq$ptP!UG8i@6l*T3E%@-oa=Nyb zdWocLwb7lCe9$*G#b%p4kg z1im9HS54|sZaKYKNquxLu7dU7Y}Tzgce?mwa*WS_JAiq+iJWURHiPPG1M^gNQIIF& z>%y-iTGdWdH#Z;HLH1p#CyhP|C-x#=W>IIn@joJp=QpG`(Ji|9zo?j`vxn2IxFxBT z9jyp2kb2RrE3hXx8*T&fEk=nk7{;uI6D9BC7)>P<0zHiM^U(uNJx+bZk~^w8cHb$d zO^N71mfcl-<-xmF#D;s4L!7)vb59^fN|9O>=Ze&D+I{MPk%PE$Uk&5b4enP&{sS5I zKK&3$+I#%shvjmruY6{0oDC`tQ-A_yChtuf(b04Ys!G1v*&VQ_? zAM!*E-+rQ|Kj*0$e)Lq;UEDLIWz%^JT#Fr)N#A&tKmSK2mcF1DnN;6--wTjJHPk)} zQ;Wda7^$|+g3tRji$;r6FKI;<4fVIY0uQ!g$wtS2xy$9BY=YUZ%E{{teW$%vR!+0d zU^o`>x}27rp$^((0J6@|dtH~8LxK}GS+v>Hwt+I+z}h!9Y&+hRQ_r*Xoo;X78*Po= z8gvf*<(goc ze2)CPUJ3>)XKG~#fEu!7)<60*MltO$11@ic+zFw5=V*}FA4+cLsj;{nO7EVhfO>Po zq>M@-h-zUJz5y+9R=iyFSFNF-Qu4qS2z}UWP<>?v*$1jVO@%nq`b|v7n?zQ%N>zC! zv4Dwi+bWUSqr!o4RF%AgVP};J(ghB>z2$XqpoSMP)p#CG%`QN7OAYj|3*;{j8|c3m zC_p?gPz=KFPz2)DlksHI{D&)1W=LjZcLbf|7zGhj$`YdIQ2mQ|Zkt2B_<0qRe>`=O zk&xs~SqsRMGp*mk;kq)+%S)X9Tt<0O$yxH&>cgWb?;?5jSs%qn=CG#8s<8gkpJt+~ zijXWSh?Cxc=Tsg=QRi$LbGBd0}ZAmCVt0 z&!vaiXpy((lIJC;XKoC2xr9P)jiJ$(fWI0;vk-nKJQk7bNqxvHRs2CV_t0 z=&Kn@{c6ZV5{DbmvNIU@bDl06sY4D7x*SKDr57$5Kb5uMV z;z(y8+_^Ziz^ptg>mj1ukRVEN?r0AA3f#H%DhK7kad!=K5x%WZ*IcBem}pckT<$d! znRCg%hQSPpoRxWII-Er3)i|O`N*zA$Tlv6}?>lZHu zKU&RO(SSGtEumi5;70Z?p|5UJUH{ul!07XqO zH5Sd>Rwn=f1*`w*m#nAu*k~yptfvWis5j#V3eSUuip+=b8!42MPn|?oDi!2oT{3nvdEcPk&Sy7+xt)e${;PP?sT))W zE5+6d*Du>b(KoOJduj`KKGM+FH!w@gy@4Vu+)CmmEvde98z_xADH@8ZRNKIfZFKY| zlALRyhc~I8xMHF1x3EeZmPX@m(G2k_jV|1xpT*PdG@t<1v~UMaFQ9?q-VWMZK#Rq^ zT~hrbWf%Q^8xA>SHyynV{#U!HcOj-(tM(vKKiPBO{R}GN)Ey|FW;IAi z2gCm~;9cqT;~j{&!5ob#_YTZL*++Zsz*w*Bi@%E%-q`&hO(6eVENt|;OGCx0{S z**kuKuqWr8T8|HKT&Z3(8BH$L6AKSg+k0GsgY@S;nk9-4sg^qbFnJeY6nN<{jV_|* zBIF2#6w&A6+7W4q;?)s)j>Dm9oX&tqHmOG$H0(aL5X+C!U;M<-dksGe@#W-wYOGsv z9E_h(?FZDJYCXWzQD26^&;#nOJ9Yw;PUQ9wvmWyUv<}lr!Wm@Ubp- zz3CLS1DBX{ntD8?#&tHF217+Jo_U&ndq^MXmSh6yMb}=Fw~Kz43}}pBE8Zd}lW>^RQoBky5**2-lYY2tXIIT)Q*OtNaXRHeB^p0 z`twIz%1*jtk1NP^S*10|wT@ELQF(&sgKH_BbOnG=y+dm$t?{~W>r;-^h`xPEUb^6C zAhoBCTE&B+xn5jRFHZU_plMufB)#l87+SFn`cqBF7Ddmg?kjpv?7*j+{4~6vaDHBR zL3{YQ>ZMdYO)tZeYl4qbUH9mvn*0k4rvF`rcL4idLHgHa^uBIxnM@u9Ye+lFFrUjU zTiWBUv~$*%asWDTR~k{CtKzOZTrR0W&tbIFwW$8~LeWwCa;jDx zcegP!43LJ-MrFr#{Hq35cd3SBJ_wZi8djAYNMY_uCs7_q3C_xU;$#s0T@GcMg99CF zyhm|gLL+DkwaE2X#hD>jaVHp4E9%rUH3TeZfwB?d!4T?gODND4b$*rub<{SXwl~SM zF^tB&L7RUNMswc4mXFS+^fz$6bHnKlwik+9;Z*FU;G;By@nfZfC^r~?Rl11%5ynl* zdo||GflRiL#dBz!x6-`E^$J80E|SwI9mR%78m>WMUPaP4PZaK46s2pFmSTA{;cAPP zq9mF+_(J?1yjv5f-RKxdY)4nTl_q2oN-c3YhV&jvQ?WLdP79^E?p`by+R}r%N;|Fo zU>vp8DlK*M<^kzX6`IF^v-2oOtF#b!-LxJIqHI1*hjS*sx@do;TE$HqTR0+>efqI4boTmN1%CT`^#hpnmxVp!*X% zNjqxeq%;z{H_`wnrL&lmM8QtT!MP;b=%jRWrA=VufhG?d^lLUzW*O?fcoVhODZLu+ zN(L1*CW&u2pia4DRpI@DWWJU{yLC!`-G)@qRcmz9-{U}~+?T1+h8kbqtjd$_J#34; zy!b7W$?Y8DA5|yFjQ+v0#_1@fJ&V16#WyHQ8;U zCQ2AX%WU6S-kiE8|=W(b#yF=A$xMtar^Y@abCX9bcI*qHLeC&BQ z9qibG&g$l_7cX_vC5KnqK2W6kWWKl&pV%i!o)P zHoDnySTef4V0@*1BaYBlwUtiphmWY-vUn)KMHTNoKf_+iN)F3D#HN!F7}GVXqjYvp zIch6A9U;QrkWQYj8E=!9xyP&&*OP$W<|g+T?R7C<+SEY$})=B#W^Eqr&*8=B4jdN2z@_cv-gi39cbI7K55W7y( zU9gFWOzPmSeC&ED)0Q1~wMgf`EsJ)zE4_7LXF%;hZXR&@p3lh*OPWe8H~ncwSEh0G zjP#AJi_h9(H=dOq-Tf|Op{a_Jzf$p@+s*-RXMIPp-8dR^JPY?!?gfmsQR{OR@3HwB@F5o?^`-^%;wAt~va|`pkb~4L_kp zjg-eC^*O~gR$_ITrN~QnTJ{09U-b4<-qEdj0YtCLy)8O2_$mH^UebC$rM<|1NjZK> zckPZ>fmjMr`uL=jfxQ|EAlo0xappA;jY#9C`1zDEY)f2K4ul8kTPvQ}OYkO;_Ckg> z2Y?7rdW)@r)Hgu+NT&n^Io9YxC3<*;gaD=KJNFsk&FW&)uXt1>c{CW*?lhzc7Asu4 zV0v-CgHjt)H$Zvqlsa1d@(>DY4p{>mVnkVi$2_Zv;v*tMX>t>#t@d_k5Y=v=v=Udt z=tzLl(0ew7R;{Fk;k2n4=DSD2$@LxO1F_mb{_kT%mE0O5;K}bOej+%6BHvMZh@6P{ zUQlV?J5Z@*4n$#O+Z3FQn<@dq7)gDbqB4sj>F=fxlM%&YeChL!N&{&sy5-S`(wX${ zp-6ts6n7fe1SxRg*!uP5(Q3N)n<~|)aYx08uDq+bsaAGrZe^aZd_E8*j_!m%OPgUp zvnxi;|26BAVr975=2#^6|J82+Q@dkXV_9?Lua}=vUGC2j$K&Yp<}g_WqtNC`AKj~Y z;A_m~^rl?wi1JuH9|+s}zc8O(HHUUm7C<{6h)5%qv{35Pv`?U!gtm&ax>R)AsH&q^ zZzVvh-xtqJ9|)}LwQmV0_nc^IODONG0vTSkrzJ+q8%;>4E4j5)>e2LGm`w%tQe1Qf zv&4R_SGwtLGyE|X_v8lt4)tiG)E7GwsCG|8rez$thpuE97~Ugfpd-aLP@J^- z6U)i1Eef+{1r2Tsj^LHx=t^0AF}XV36V;U78I{?ywc;Z0tVC7kuB78_m7dzPRY7#> zW2L)p{%RRTnnrSS#g*E1Q#^EqjQxPd>y`GLR2`T7Yk=s5O8ap>=4o#&U+%sd&``nV zIBNrO*6NpF3qpJ4!w+62B2wLo_Qg-@KegdG=p)yGp=ztx#K^jIx{KoN%n|fU*VFp; zN;}=n^&s?QrTfsyMkw7l7`R%;=QmJX2QJ#p)Fok-wQ1zN@s??cM@POSXhoTD@tjS_aon zN{K0#0kCE>x)$qCUrM=+5s;KPGxkFMX3eb2~HVx^b zd?hd>N$vuZ#c=}A9fua*fI% z4P(Jo;CLp@IQ&5}7;kV}5uw-UtM`@9byu%}#iq^p=-1@gC$yczT~*&$*#O$ExDKpb z^HVd#vac}CKDmdCsv6mKPd>16L((yZs?v2!Zvbo4mFr?|0?~ywwa0|8Pj{t`m+=-5 zoRs{@lHvZoZ@Vjf-DekoWTU9-1+=}p@~QiQ+xGYix1}w-Z!ENmdaI2Oii9KL0?vLH8vO?eQrO+3S0iGFnwtMRHNaO!3Yt z2F02aX&$J<+mhtExdf!jk>CCj=69d-$UcEZkEAnqzf}ca`iO1Jm(&jBEG|f}hI)%6 zykD;%dFY=#u@`7~s`fcIo>GlIipeYNIq3F!H$9gu-uXxwVAZ#5rYEuJSRujHR1Stp%_o+>CFx?{fD}Nz`oUv2`beqmb(9hI z`pJEx_KB+kDexmqvV($x?esK1h^~JG_i{Oi8h@+|5j%tF$B&i%?(;(I`BsL|$&b-v zzF~ad%09K4?8f*rMU+l|B^1Q>xkvV9C;X0kN|?Qr17WmjfYRC{YPLOo>Fi+I&|Ycl zUBCpCfEzOYu+W!Qn$O;F(5jf{`EWI&>p}yF6-!#l1{Ldbm$5ch@tVV3WY2Smv|4_+fS({ z&O}k;eo7D5CDCB2tkR9q993oUddwty(T2Hi>F$|x?d9K?OYQnA?Y!2;sPSy{wkJlC zL{Kb!)nEBo&~IJ1=I z4#hfdLIULu#^m>``mDBW83Z&z`Dx!!Oak)eD2{lgaTZrE55X`dVL6TE=h@{lR<+G5 zz|DIl$p3rAvxY44ij~0m)6gF<9sVIssqL!IVob$KK*B1jJ`@=^yGn}EC9LKIY0+$@ zE(H!%YKk+fWzKXVYe48mn$HxB5{4^I&iE`Gn2#vv7mWU0KT}$}=y$FKCQL*A8!6?150cfrY`NK!78|}ksN%rB4P4?mJ zWczSP3c|YurOZ%zQr;LIaR)+moSpc;m4-BKxDp}Kw$Q!d%5mM2ZD8(5nl3yh9-;WT zUSdS0&6zCpW&~DtE?I1`DQWb{NchgA?G!o^{S4lj?;WX(@I1Z~Te${ zCdYlIH1yS9*$q0c;m99Mdd?mourX$w(g6Bdu@|BK9KyE$&+!^$VLBClt_&8YebjA~ zGEA8F(_DT=9-y9IDUF?t2NB^54UHdv07#pMhsvBkclh+kRyE5{JBE6{X+X*)a8xQL z%PzF+GH80r{0dsm`wIGoHfmF!QmU>qUjYfTlge@@j0U~WFG_V!eGb!Xtzlsfjrv;o zOuH~Qm}dQ-GE|tZ#*b5mY0cMyDd;a{sMds=lK(FVsZ9S?X-ZRrlLA)QZDUq zUEB+BeaWt46gnIEf|447|2xmKsL>QG$;Z($Coyfe!yBt%A62nF~Zma{V49%bN<$)R_2bP{qPn;PK&vwM%MF31gI6 z>Jmmu9K}q7YfYI)C&4O`=To)m99}@5;;Bn9BI*D(;TF_34hys?@l@vz5atsIqiN_g zco=qi(0(_RS|6zZKbbq752?dnN(&eLJQH(bzo^woO0VdudP={a;8)_zG~g$tzHZ@e zFn-H*Jdk$$gz`k}0m6%x{TJ((roF0;U1z}d64F8FO(|c)?S4H2o-J}8#mrD9c!cc- z0eu@gd^Qd9{ty~J7XGQyvc>WP6!;fxHe@U;8E#8Qu|F$yTg^F$m~#7zWu-mCrBo1h8@)gf(Pavec8HpuHGiP0_z9b^VJ@ z0fEhk@@IV@g4DukkYE+Vp?_3J18Vstl$keD(KXOVWrAi?1;#9dhsr7;{|Sh&eumOn z@?zKL84CPO@e-+Lq@6~bLB*=Kg6b7mOP#duYhEy%akjUg0&z} zY|3WJp}{r!K+XI>#!Wg=GdVQuRdUX>)DplcwhZ^W6bda{MrB+)xK z55y|QxG+!B+(WP1r)9d%4Fef**mQN?n^D*>LDm9)qJDy%`O+J|tAB?-l&S zMkd=1)bT`GB7cE@Ayk>{9`+0@wwC&ghK4D_yh5JaL{+ncl^rH|2bY3WB_rsMB`xfQ zy*P!#1E{iF7s^YzGF$n++VWQ*3`SLv+pEp>X>vIBNf^sy8`Pzgfo9u18DC3+HuZIg z?6b8C%0s9_l;W#R1;D+yujviqRBa}yZ&a%Hyui?ZWH~i3K0@i?9vTFajRMR;G%x~# zS0lzX5$tk;X=o&DAFUujml^_QIg*vbx3`|;ZDVlqGKYf6-f~kz-wF}NFstM+Mt0Yx z&JN|i2c7nx*rindJziXe{Q>`nMxpaIhyRb9hs%gwX2U-dGDwnG5FyjhrAC0IGdtk+ zR#!TI4z-U$pP4$RDrIgY&5ptX_u?ojh{Ei~7_H_rC7PB-W1Z4G_aDin%#|czjIkC8 zH;G2V&GYcXYhkS9w>A0H*tc}CAddRPD!w8$?k&=L-aJIAVqB@XinKy%kM;AxAeUSB zF;v+DUa7>J7szx~51?9o3ZrZ+s^NSi5dX7#OEHF0>@+OE8{=h}v?=jc!~&A})uxb& z@R_GTNR_;%C>7C7R_&Qc69Ics1du4rJ$)VT1QH}vP)cFPa{d0EHXD( z_L1VFsZpF{O(%Ji<%Xh|vPAk>`uls6ciqyn;nJ*9% zUx^l&gFj#Atn#F4znb0^yB<={UrhrKYs1YzbAUq&AAS9qwK+6Dp62kb}%>!BlY;ZW^f6m__Knv^{#x|lMH5N6( zNi^l<;gs^lRCG}}O@#%#sH z0dVWuS!#JLYVG5qU%3y#^3Im%HjDnOrwhdUDg(|&*=%aiEU6R}r)3VS9dK1y;0pw5 z@4&5;YaNmt0{mAxc>Ci-qjCea-(u>iz5K>N)3%uKZABo(ZZY|Z*kDTCVrnWfgXt1K zPlUv8HEne^ghe>kNW!esV`Ue5wAJ*7*b-%#y3I79oj7yHa^|M#fJUr)KvZCA*6QU0 z@QUs09rQ~cF_gR<2jDPNbJOzF<=d8TUGCtp893!B-7YZU^M&U$`?l%02z)`q3Qe6S zq`v^K3+{<;qT)Mi_R zLj&i)Jq(1zK?vmq(w#z6qmiLOz>2Yuwt%796G6w3PXXWgJ2;F1UlL<$_7C`XfIgs4 zz~q4Mfy-c=<0St{fG^AV{{a*l%#tPmN(iR0cTA1C-(*b9UID$O%nt&3g0?P%xyCYo z7(-tH%8LTz;@_f8i+~nwTi_F%DB60*^z*D|(ag~Wn1mQWj!gmrz1Yt8?o{{{ioFQi`a01u9iYX;zb(u!Zf93LN;fn*)SZkmra>3 zOh1c*m*|t1ra)0}nKE9Q{uU3e(7#@p#x%;w0jFo;wqe5@97f?E|3(fQF>LKNytc@p z{jW@&#r|9>eP#MetiDR4%1ob#;;WW~GSfzlNX@6g?>wJq+cD)^TncK zoDE@qUtBJxPn^tto`EIEUG?N0KXrC+=r`hDI5&4u3H{+@9#F4{DXxP@I5>PZV#f|# z+yQ7P=(8VL@|?^+2!Zbm2D_L8#JcA+!^Pa+_vLd$sQvCp2Zzr1w|%FB!;YOW=~6oH zVs0kVOX;d>2WgaPZ%%k02=Cz_= zK25^lMwBg}5^v;Uc0A4SF;DS+77qzEC*Y{%qI3s``{{pu;h>*O^wh^ZMC22F>TAYf zWr}6KuX&~riHmUtmpKkOO0X<$V2;sk@-uFC|yH+{LJS?=34Uc zH*XZ7>n(@<%||u7aU!mX*;^DP(b^{Fc4EmUy41wHSKLgtnBOtC*9h}wI^NWrB_3>{ zCC#AB&~4Pdxp})dY@xf&%?m|o8ilto_u?%IM_QQwC6?^KejD>=;>ix0*wXxgIJlEm zv@{)JEoGg}^o8_S2|Il*wL-RN2t{&0*ADKTCrH?Fs zeq`>c6FEVao&C+9YQ*YLavXpJ@!A0DiPveG}2Z{6rlswG*y=$@&add+wIXDcQglrqB)o|$frIE%A zH%ExsM7M_{Z+jG4Fv7e>+%-|pk>)Als+rc0G(Qy=7SZz0&A}pPF*O@yZXxC@p&_Hp z--^Jcv~3g|)PtoI@P&Dj$V;$9ePO;1pS;pC?Mv2X;2K&t#=Nuko`>74(5j}HbD zEi=ZN*Q4q-kl)uZmu(v?ef}R;-vL&|@x6T+2>K&PjPYlTF~%0VCNcIFvBj9gnqrzU zw#3*=5;aCqQIVjcA_rmb-sRFRMMOjvkuK83D2-+NZS|Nncw`>^bp z_nc{G&YYQ@-JSi(bC0FK&MB9cd2SVXk?Q#6p5I!CsAzIqflgE#P01@zkct?(xDtIJ zD3+eBgxfO5s_(4wTmUU6(8gapM~UJD^8dy2zVN?9hku0|2uoJGt@a!%L}ePyTZ5`L zrBmS=G)H&_bzO^;>NC`ZYdr%kgq*EDU*~xZJ^LD&H$bHh*XiqxP(uB6O5O-#EY78# zn>>FIDK}`xCeMqaxRAzfM*qWByuG)e;SLn5JGOYHS_t!9b^7m~7@0E4DDn@ewfR0R z{}bv-ctBVFgun5xpm(>ShgVe4Puo1N^^&TfoUU6Y&Db<^)6e5|x~CO7T{Dhn6?j~= ziso)d9M@`6wxf$3sG+VqJeP^;8rsI^ghy1g1754 z_j!(c?Xlxw%>MZEPzqKf_p6KddCq_naZ+VR&v(ZPpJs}`=$T|~Y=u}?o)34kOlmz$ zN{pv$X>31C_OYHx9gKU9SiS0RL2I*v{jmeO(GkJ_oxU0mBKUIpdNkg%vnV}C-tnGe zgyKXu<2^?Tqce3%@SJVE_a6wpn8u2df5S*JVAQYTsJET}AZT0GIK|0Ha?1SB3vjt5g0LDg$i0;o7oU^f0Jub=l+lRc19 zM#MCh*HhF)uW{nIO!YY1h8vg@5WriM)0jzK$Ap77rBCweJ37c49IKh8)2L4Z)3#Me zvCR8E{?9^6d5no?;70j?;_KIPU+O*Ct7|tGKW5c{Wz?u|12MJrr#X|oCJb^20IzGS zcbj*M_j669pPJ^FJ~MreBJW-V00%fyXdzRp@;S($2vg|M*KqUjq`vh`0i( zSfdu1be-%SPcvu+sD#t5DPBE9S~z)5@%ma|8>spzUXQFxBOx(_vK{?ImKz@!D~u0~mBuP# zwXw!nYlIOoPkaaI$V{d_1?6%Tl+~QT&p?})w*5Tti@>>otde=ani&)GS<(!u^8$^t zFmRD}{u20O#$S0K@}qS2!v7lmJl(6SZP9g(XJ|)9x}olw?)9aQ*rTWXa5=+>pub)pXy%^z5eRRpD%2F?6pILMW|cry|!D5u#5Dl(F?n`#;D&nd9_#x zd@$>qR`i3C6!loE*BWbKzOJ@gNaHPqYoR*+73rXjP#&pCuSu_4+Qc-Tzzv)Qy{Gm5 z|JNVhdP5o|Vw%)>Z%7$)tzF$tvIjg{d1@GawoK~YxrqVmkNS@4I~vzm2TrP6mPuwI z^1Nu~N@=PvN_23gwA0e4Kl#Gbh!TVP>MxQdE-kQC<*!mV;bf#ize;0OK7<*|UeeKlgx)NdDjH<{J*-GZ-2?417b+@)Cba)~4JX6YYW&v=fwdNRy8 zo_^UPjS=PXWY{8Y6om=&`c~<-NJyf(tq4b4qGi8JvEsmG>hp)ROE{&F_aD-iHl-;@ zq5qPFcnf%H^Qm6ezhfVJ_f+clr!+!jrP885rCCBwBdf+oh4hEt~$kLmJQ{JDX$v|JTa!McMS#4r!!a*j4bYChc7^ z5@X3#I=MrdFWk-aV23ozw#3Y-u0lT5W*YyO^s6YiMm~Q@OGQi$y|PofDvY_5w^N$a zvo05s9Y=mS`b(YeQLL9@pIXw)noqpKf8_qnm*6 z=&!coBLvwclZBK^^YWE%10J?tk~99bHQ4lYP<;{p(60VY7MP z|6c36+yl~a&R1KI_fDkhdyi80NgwnmV*KT`|5x+=_u9Yt9=+}eYl^y0W=G^ue4iQ| zr5bDV1ISOJ_zs@fXwtoc1|E>+^slP`*kh6dzQ=}RFxCWgx|Q>`jvAs-L%+uK1e+He zKmjWs((MCM-|ojN5krgyM`6lp@~jcKfDfyrHxI%@sw?TUgVMroNmVSh2xEGVMtupY ztcuPZl!kQks0PpWV=V{H?;G&KtLe!>6t=XQ-gJ^21h&OI3Y#M=t0hWVRQ(0~|qLj%lI5Bhq@y(AJaGKQeeTfi zx~*GqF)K5zEtG`rqZ`LzvO$jY=?RItB<}~O<0n}5m^WhymOS$IQ~e34zi8i2-Q7?b zEXr(ilN^S%9b~ybzvY5#M>SlX5biQyCKi|uN8}u$Xg({>*ceY*DB7LrJ9i1|1}-#_q(S1yVOmL2yvR9113b|2 zJdUcrdPum8cEM91r=*@D6~yN8ZN(uRigY99nebw;uIJzY82rHnxsgF zMY2MfigdQCgAui{S#@y8k2>9ec`Fa117Z&BEluc>%bboQe|#UD4ZtgmYLU0}wnZ;z zKQOv}@ngS_b-K^N)am*-X{x~YhD_KB*9VOi;!h`ixR3eM1s`duoqqu0SgrbTC1g?p zsDm$ty_Nua-xpPj2&6J!$xGw~(H=jkhiC{Qy&uwW4WW1Zq0EvHTI~;IMVzK!f9Z7h z%21?bH)bkUH$GZ0VaAlnOQvBgIdFzH21r-C7KMRpvtZtoNxMG7w+Zm+sOB(QWWw-_ zp-==uCCWMaEf9^fH-h23Snc>^pfe_rOn2$Gl+*36{by=9 zO64BU>AtrV?k1jEL(#b%6X=UGNT(%%63@V%niFYqm^5lycoHOS)=lD=vuBNmgGynf z+jM6}P{*airq5hD!+Fi0qvtJyH?C!F$C(=UQ>5>BiOz+gU4t%BewZ{{v|Yl+&}cLN zWSV>y^>M;pU1#A1k}uQMvoJfC6nZ0Enj*|8v?yE}*8M;#mvjwkh) zg-d5eQ5wxThsjM{I^~~}_KM~V_4^3vEi9N^p+C+;J&{*b_w&*_SYNwJ=Obb6j%M|4 zr1ZCiID(h5qcCSoyH4&=Qtuws*E#vk+df?e#cA}GZCjC*Yc83iq!Ck-bGaacUC>-i zbzZP++cuqUh|5ry`OD@l+YZSl#=9c8Btrv67S(dZ*5H3Ot;5v7MFp`2LL&Ki&Go4 zT&Mfd<$a_Ubc;H~prhs9qW5EvmP3*HZ49eZDyFTma3*=hWQ>LNMc<*OSZOZrFf=Pp z+Bm}DE)weU{$VVBPG5rzzFYpo@^6=ak1S;7*z_H{2nEImJ`Q7mx=Uqo(kdd(y5X{f70#?D_^vmSk{hT!1-{F@i5gQeV&yc^`)N|JaBQZcG_-jfHrq*u zu^o6uU#Cl7i}Gg_nhtAmZlUaS7)e|UwWMPjzB5}llytAaGy&4<{rt#O& z&G^E}>R*=ZU|r~Rzx}fFC>jB;nOwnKsd5iwuvq!a4h#=?tn~__`fAg=? zC&3RfDi$F1W@nPFN#BXWf2jGIv{q!h(5f71NAK*zkm%O$m`*o#_2|_wQ&2B{bLYW7 z9Cp8siDuRj`ue)GvzPfOgu8zJ*C668hpH>Jh4E)sJFVXiJo-Nm>Rah5ujN5$;x###J-%FG#%#Apo-egeuIPDe|j8^?2$Sc>#R&e8o+9%~}#<9o>0{XDI{ z2g_F?ss0|u^Jta+DU za_})GdvMqoLs{iguO7)UC_(4X*3Vf#!|l8A_~zF5sS{_q!I{UXRu7~OSaFV{P8HIi zo>Dv)b=i72L#8^;+rZUWiEv6hEvS$-+a@Kj#P{QQ@rbTgz(<89(!htX^5R7L>LFZ% zl0+vS!c1C{=;1>cVZ|kyS1JA0xgZ%at%o4RpD`-bB~yB(wAe1^GEl1zH%$8*OOTi8 z{VJ?zIHb@gRnoY=Nh#pje0-A2pwmq{iMcN$)}I3T1oGv$h^~^liuM#ztE67tjH%#? znH!*TjhYTBIhCraq#nac8R`0oR-aEdeDN|(%#D%G-ZW12t5LHz?D!lbVj6u|4W&k; z(HGUyn9kW*%pE^t;mJiPK}i;!s742puh7+M>0~#LtKizM{q#Mz7p2^aJj1Tijv6>X z4DC{l)T3LICiB;Z?HhiA@^@^QHV&h=S2(W{dxMVDL7%wPEw7Wd ziAapBkD=GR$v=pB2Q%y}ZM z7Y@Y~{X`npExMRXIB(PZO*-A5?h7_8+=R9(rnV;-kCZz!rvYhWvuno&X<5&(yO8a& z6Qz9dTZ=dYX&qu@-6hco(`vg*!y0i(RaQ!_jqq`K_o%HAPN?Y~^=Oh-*p-(d1*`F! zXYPV4C?l69sc&cLJ}~RqyC!d*f-ho)+*jk8q_eo;R*BvGFsPMPlD=8`!8W-HVq%yF znz@Qzc_t0$>`=`S-`moE%MVEIcr{IYhB3aPnvOn`dUbWF0oUf|U0l>j9>cd_J*0*b zpP@gs*U;N7s8)0>ebs_~;{1pVEojn=I=a|`ON{2nw4xRB@R)k?Z|cU%juPPYQQ>?hQ_4J!^U4HVplK3CSH z-f5GjTf7$Y41%xph8P}UGUEfU?U=oqTh!C-(i&lj9o6V<3w@7XCI3RK>-4!ZX3ktR zYvCu;KK*je{LdCH{OT*LpEx+Ei!Ah$UJ(h-bj(_RQMCVqO?z?14aHYGa`=dv)=_V7 zA&QTwuiEHu36Vf*g{>a<-4sunZl}K@>b%r0ujz+ltujote@j2yN|>Y6jqm6?S&EW4 zb$4(5+pmb+bX9s!kBhggEV3A=pJsi#(Su))u{eI-9S|WcB1>J-h7`)#Hdh(L#h^rt7LdX(^Jg;W||xFAiK+&$;RUvJg&r z>Id%nMHpKO)cvGSv=rFAb+(s&geWRew|VJnEJap@`inu|3H7N||4{Tpg*fs^^)c%I z!A!57KJe9d6H)av+gE>3BtM~RzIwf=Xizu$=|2_te7t%wKp$*jS>EQUt`5`>vame< zuP3<$=?CKjV4jo^q;C^RdnhhgzfnZ*RX+&Ps}`bZKRrCHpCi%^sG~#m_wcBPGxZ45 zpAy;s(D^WZf6@GpdMiwSUx<=pYSKCVV2iHD-MnCTQ(+sQ;80-${%-2O5&B>u@=j5R zsy`~~JZW+i3g;?OQIvj+$dJ^o7xbT43O676F-AX9n0@G2jDCfP@};LS`YE<;zDQG~ z;R?&i54YU(Q+j0iF_OL!3!qF{Z->i@c8BBiqf@c^K|=DUOR@S9yNmq6?e45Owo88{ z{l#|4zb4F#`k`#?%(uF-=@c&fT>?PcPD80*{2X_q&oI{A4m0GRHGIoI=<*Vtk#WoW zbGR3rGV@zIteW@hya)3>p0CsS&wp*fl!g5ltz6`_X!injW1RlJ4$FUKIeR2{@t!2_T zjiQqDtA%em^}B>~Q3f5kr0=uaArm4URw4OcI167bI2`0K4i<3G@;4^SG;$4-Z5p|O zNvA9p=*Q)dazMWN8%X~3WhjCn%QZ~8-T*mpXn!P(V>pfxINqlb$@=cXe1m2u>xb_) z=RxST#gP9B$2T~>=C~Ca{4L1uaQuMddxpyjIrX2JY}UxpOgh~H`syT*pW>L!P=p4} z1UU=G7YwB_WI30~5+*y$2f1J#haHNTHG|0ljhxJ+>ur{r2yzMsO9pCSTrY7Kw=lM9+Bqq%oIhn~4 zjhw<{oko7lq{9=I9m}Mmkz<%l(8$qDmT2TCO}2q$KVs6Xku&;P;K53#MuulH?52^Q zFd3zhvzSb7q#G&vKEkbunp5=lzmzl~LWgl+O=Py~Qx5Kg1^mTUP@n~W2f3Al4$aKn z1@dnWnzY~!klQ&J!$HfJ<;3jkM)v5jYE2=u(s?PwGF=W|qD1@6sXC3)_zrMpuENBIL;+bbHm8R^^O?%<^>`f@zR5=FsR^|c}_TJ6sGLgV*&v zEQckhu!ud%zk~D1<=`75KDE#d{2a=}F$l+BBfzRlp(}a%zePhTeV(tMDH77?M81Cb zf9ui^<<+_G3Eg0b&coT>F`aJY>pgoa8JuC?ep~@2JA4o2d^-@qgbezpK>wj=z(;2a z^uLR`Od5R?iAH77&YKuT9j{R8O})KHyQ10@>Ze(BaxrsKpR%4k%=GOo{owy*G4$$k zB)JU7&zx+TS*2V00a*RLPVq&0&rYUXj`js>CnA?t-PX5=usm8;tl!k%H=m;qMy>nz z6}tDikWmbE7}HPa#^SI~%crNsD16-+0m4D@)KBs%ZU6z_Tn58swv1TH7>CruX z>03qjz2%+2czMby95A1XkK-+tisg-5=UU(#`oNUVBRIpd{@N#|A>lGD{@6hiT zJKX{_wS8L!je4MuXN`25<$&Wd| zA9tc(F16Erv{C4G;;=8mlb==k?V_Nb8mnNbX-{ZHwSIw+8c3~1TUBEbsan5Bv^CP6 z8t|)|sICT?@SzPbuE1LyTzX)?ump18t1Mm-JJ%#o9x~QKu>jz+pcU;}ls^1|* z8quTY==)9{G@>0^4e`L!NBVa}mIrNYhi_=}AVWLauECS&UsSi*>tql4J)uY^?d7*b zjCAq`oC>6qf6Ai;CY+&ihA5J0hlM;`xEd(XLjFSFvuDi~^8QYa-YB`{;z6(o4{vf7 z@^*oH1Fu-(?BSz2SjtQA%$OgQSjpdtTz_@qE3!MD|Awe8@;2fwiDu~|c zAUliXU<&L2S$yx;s-wI>G=$JMd`>&926dEea4mO+BL5=~77k(R-T%lVgoubxU$>Pf z;5)ha$X6#>7H&~g(@FkNq(!N{?c`~g-(I8@ugN)`8e%xRK7&zKhgh24SuPfJan$d1 zIY~q%(1X|I77>-C-s>VCx9pUa&a&HALAD@W-P=uukv3iw21EIPU7aHPSUfhmW=ddS)TZMzQW)iuLjSj>8y?Uh_Q@wQyt$sv!Wcdh{B zny2pSiK2EdC}3x09-;vr2QfR-w&RHFvS z-QZQMRbPHs({|2NB!zp0779VQq5 z*QpuMt8-EN&v6XmqJ=fn=fk0?Hhh(1I9k`Kh5C(<_jhq?<#LQ0Zl@c{VhOE!HF|{n zp@m)Zb53>`gCXsD_1XI}uD~4ksFOaFS6TF~+b1K38IxWp^CO(?-5dc~{xu0b#n(|y z8i`s8r-RgM6f8L6pgMjOTZW^v`uk`m(p=QDV`OWKo&`q`t;51^gziJmtAc};BbjVC zqFx^>SKMCJV}co*!dRL{ z4jv1#C|EVkltZEPGwR|`+hoDg}Hd=ZUNf z>h90wdN|cs+A>$(B%K7yW`qBbs+YoVPCy8oqIFLJZgn_qDm9nEy;8~I03 zX2vcZY<$!UR z?j!2*>6`DN=ClF|{T^nWRY;*fpcZMj)ILATo-prXid_O1k#I-t{*!zFm)51KvXql5 zDx;8}Q9<*4dV87t_d5mUsL30nS6b+X&J?;aI1j=3FIHbeIh|i7ujY?b_Fj%$ohoSh za`?A|3fjC}UMWlu>E?3zZxK;Ri&w}$3#p1Ou0S<#8(yr0F2kzniDp>}zc4q^;@?oN+^1^(Z*1&gE%eb^ zE=ViwT`PZOS=K63;ab_zuAz;aaRWD_({q{Du9N56l{{x`Gh=nYGS|>8n^+PFWO53H_A;S*HL|U6BnZFfcpMsxeFYMGfm%$Ms{xT5LN^5x>iE{LaGGKQM?iAEn?wpcToLvj2d)EjdQV|CB?8>j|2+ zO)l(I?PlPzj)f*1PSW7*XhVEn*ke01;YfJ78(D>UP{0mk)$Bp#JLCngn@=H1hhg6e z-9Q}nC8uciUobzc&j(FqLn?k*H9N+IW6tS4`}xl2AGJdEn<-Eaj$ z@l`iD$l3650c5{dE*AxXGODs)Agrs3s-W9*OcxKaCY z`JK01t|GD5`eKgT5655qg>Dc}J55(<)Csg)$yHi&LXPg_dyVt_bqH7q*VK`2te1l8 z>a3F>UU$j^v%?q+mLI{T+b8F#tKFg6PDKSA=_f8|LxH-JgZpiyhkKFroBEm=ho9JzOXPXb8Yp-aBga( z#eVRcj!)?Wf2iBHnX>%h^pc;cYXjtk!qTJNK#75}gQfJZfo25BdXelv_ky5a-#s)k z7{-O|vh=~2PBiaR{|=FpP>6$MABw3#8a@Jk218NVA$8apIYo$&qttK~<`?6tI)=*` zmbhJ{&X1I36xUy^yTA_JEs(Zege-2?Oo~AoQ6Xd-3zN<|O-d}x!|@Ewk3;zz&QN@u zZ0zK5R)Mm{{Rpl2o~8BiD35EndNW?O6QWwBhl%p0PGwOnGZ7aR_IQKlmn3v7hiH7I z8Fes6)9_2kMv0;4mtgiKu@sw(mY3qxhGe$-x&)e?0-G`?l2-~MC`oE%id=}<>t#ww zgD*@=q1V$f;c`f&8R_tqWvOaFy6lV*DT6-BgliAUq6e8^xL%<-S?J5AY%0xyn<&Uu zU%w)Ev+P%w%f8TNYp;Jk?!A;>tD}$3RZ_ji*Sv`!fi;+SglK%N3Uo>1ph$g^Np?sWVi2G0t2ihYPS z#8djCDv^1v2YFSZK53`Ox(X&<;7Nz7I5RJLtC~B9L>sHoQm%TsSPd`Ppr;-+XyY)M z7Sv!=b2F+QH9W1C!`T78JgtL)9X}L$;VqPbe}9iqdG(( z_~x{q(Mmtr>2|Icx}Sfx({0!!bbsQE$E(49bto2M#^4yo3o;EC=*_1nZ*nv(c?u2r zCQ$uTj8IY%RW{3e`Y5TK!78k!{KD%g5gfE!!DIrHVIApOAN?Luo=ezxX=KkO>OU>= zN0zqXW-vuaZ+uTj^MISte8xCqDz1u&eFa7(gp^Nq2a~d#@ zf$^&iT}1gg`eL=A=PKt2FswiK{>*zOQt;(a#}IEe@nD1_IV{3Jc|{v1!+epHPQ%w2KG^M$fp}K2 z-Z4noSED1n&x4NA=y>lq&{<4(z33hNvSjD9v+5lIo?|9>9ZkkSW3Vv@>1S}*>VkI^ zcnMjct@%}e#|W9t2o0O+J(-SJ%VwfgMa4&AF!65cFQsPzv9%5{yPQM#Yh^8ho{%$xXoSSL%ABGtM z%OQXLfwB}lqvwAZ#tF9;8vCc=w>}42kyW>AVXOiEE%IIIo9%nWSEsw`izaXNp`qF7o4ZB5_15Mn4%<&ja z_6`GHU)xLH{$*GpiuY0cUxr^rwj&MRX=oG~2dMYoD17ZfO8ncfmmhzbxy!&GR-(Um z89o>8&Xl>!Fv+&a*%w)y4TeoS<9n&7e$+qo<8H%M;d+=xI2i7Th9mUa9)q{=aHa4) zhK2l`iuGPYl_)w+PxczliQ{f$+GofYwI^whBbvg^o%|dPM>_-&Qg+2>uf~S-Qor4A z*ouj%CtW>&LbQ8Qhl7S)Vy~ngJct*bgo{irPKE&@TBZmm!xZ6Spav(y1YtI)9~^?p z1zz;I{Es0~1o^8@E+~{Zj)xzQqP`BN>H1MLc>8JWqGb4vpa0jp8n%j(GwK`140yZt zcsR{CZaCICF#K3ml(S24!z=~+fT`Ww>RU|{vL){A)=D$o+qqg z?`0b71*;0bOka5!yzr!-TJL2TYayJ|X{a7`%uS~?dc$VE_jE^Z2o}CshigFzgUcW*VayMu-eEtx^o<#-!T zin3fMEAV;kw^f58j_jdW6-`{dhu(^U0T%94 ztuGkXV4{D3wnW1gA`a5+Xu~z(bcn((qEYJ)shwjCA0u@aS`Z7BA2>|MVqs=chv`Br zyhZ(Cs)>aiVgY1boZ%E!9q?K41j7wceS+>JfKls4KPAFoO(%&G4Ntop$qyQ}H)C$Y zl-2W`s59{RME*&zm1-h$lHrO-I7Nm_a0HH?bn_DW8m1-#lW{hA(eKHynQ%#cmTc%? z(K|*)BHbzq&z#rkDhnSJ-p$kL!a(18_OK9dQOMLg1<5)aXikdZk}xauS}MA9y*GuW z!aqeBsUg*nDh~Lnv1x{hn3R~*mUP3nf^UF)m1Q{3(`MT%7(xoq(2^^N5fnzoE6_uI z7?oZz;0=$n)IZy>@ztPkl%v?n{sEeE&+3q_>bYz<0%26?xf!+|5=FbO!8pnEqaFr2p#p~?7k zvEjOKPNBMdbezgm$}BJhTYIDm;L zT`;^}jjS@f2d~kf-mXRq;`t0JuQ41HwNGh7EgY2#9@BUP+jMB9$BzsvtSeiQ{T!;< z6Vjcw)EP!~N@(NqR5oCgZS$juI>SoK=;waa^RZ!(sNF-G9vkk9C`Vdcj{&gWk&e_G zdI`7v6k2bXBy#tw)%AuXOHM^_twiwd2Cpjux(MKyiX=EGvfWH^5YBNmhUhCzLDb(7=4UOzp`1kcC zOlu@cXfr$!83sE490_B0;tuU_R@vTaL_5Y)QR#Pnxbn6Tof+bJE*xW8o!&QeRPaiQ`f9iM0YtzDTwm6v)TW;tt9LQ4*uNbx`0N@x<7bjsS|{ z)&Km50goh_W&@xgN!?|`fZJtKUj>kRS$*;<1FmT_tP=opn)+)e23#`9+YUfhrh40s z0jF&0))_!rwz{x01CH0|pVt8-UsF?GXTTxX{SAZ@a@9$1aJVgxe(wq(CSN_3QHAP&ZVcd!pr76Z5OG`edXs^=JCxfUKv;>|`7H*jOX<@d07CAm`+G1@ai8Me z24E^zTi#}%tb#sz2Y~NGb;COhlvI(a7XYPNE$hWVQ7ygG8-Vmk{kAs)1&`@?9{?Wp zYIYw6avP{aKLBox>hyjLn4i+l{s3H?)u{dqWVO)a_W-!Gs>25W_)pq%G|VVD-as37 z1iwj+1C^eZPVN4x&p>4ihG+-6H3;I4d(<}vbNmGCYBvOcgQMy)gn^g?ba^O%wgalg zFb1Ly(S+g3gbvMz0&u+{aM#*@6rCBav||?^Ix_;I4K8Zc2o?=HO8q|oPa`T+xY zujAB*0IH9xH$G$lp4RRo02L?IIUh0L>p}ZQ0VwlO<3}-|cv16cWLM(#BD;jHr@N~Q z#wa~tJ~FKv3t8N`2^_2BiUNgpk3$%@X)f})z*~Jfj?-}Sr4J?m$n{m%P5@x-8i2$` zQI9MB{prd?rHe2J;M)z#cl_?+98anf{zv6|7&=co%bVTSTVL|mlzXCmBik=F1zB8CEHDu=9d zV^QRn@5hJ5(au@m;pR^ipYc9K!z^W%2uY+#pCF7^bhq(2B#9zE0d7jBHV#)L)416< zn=aGV*}(BeLJWt?QmL8GzG>>HPr0yI9A7sFfRd>O&S8xfUC}h!>ze-nvi)4?ETn9; z*XJx+V5V=rfT+hc^~4tpfiGj$hwJLEdaO_s`U#P zNGqbDivT#?R)1N^la+YU$zk0P1Sh_kLg?ON@KxdKO90>jve$lM!1pQ5UJ9V>sp`0t0i}gve+E#}qCWc>fTi?2fIeETjJGU$ z9-wYm&b`mWfdW=QrochHw}KbRj`~b_OBGb#ad-vXn{rHe*3x-5Wyo%GEjS$`5iiv{ z4HvHE9ENMaCF&!lo*~y-rfgeKf!4sbz~_POz|!iNTaLV%9y67W7<=oP!j@z9?o4&` z4d5!5ARNx&ZugC)+GVazcT?kl`Gzh75#67FZS~aD4DI_rp-m^1{_F+%yM|Y*y=mth?o4v8a0)9=} z&H=_|mP$mr(Hg}|K5i|H@sdy2za|QESNdT`IuqrA5GDs|b%%Mn?xC@yOz2X#ClG4! z_7Cwl`k(g4%D`U24$=n)xj6zCDM&YrsjhduOOWd&W2!ODm}$%~rW>=s%XOrY9?GmS zE&CyZZ4`Lv#pM9gSB=@=o0zsXqvqETs?$POkxn+3?I4AED1!uc1}X4R@H&MH*`88P z3*!;GcuF}Zl3Zz{r*g@<p52Nd}*1i^cRu7~8hxXw^ak95KYeac zJ{K+lq0@!j!)!O0`Q|6^V!<@TTN%_p zS3~Zh(6vliC*HwcVR=|g3(+JWqBn%lAKuDr+X@Z2gO))~n~_ol^K7r?S5{R$=c?7< z0?YLb`5Kiu-HOj}3PDJrQlpx2Nzr_UtbCN--J~#%=UZ2O_rcZ7CxJC_8EA?yn&6}K zoKa($IK zo!c0(zKS?EOJHi}X@sBBy+_b_pq*==iK|&JVq@o{GCae7o|gJ4BR+SI#!kB z?s5Ti90T0093JKNOI;O0vmuP)Iu_|LWnJH-(yRI>*A09#meslXI;UP40_?qT_&D z2Lmrbb_E;~sVIIKQ{C#Y7E!AiThPnGW)?@GkU{a_S~cE12j#{v-O=YMmm&~373|gk zKWI*;OGctc5+KkyOl$S{I%JEwMWUbQF)mVC&{~O{#3L=E8n`zP4vS>?j2Ml23fpbb zsCd|%Qxdq=r?K!BkGLKj5|82LOd6G3V}%>RNz^M)={BN_A-kr#S=uUHF|?5nKka&n zquhqU7@4wC^Ui^e#C9Hm%1GNKJnUJ%&Qv9Tvo1vrzb=8pS>bTY_xX)&kIXja^g&#`^#M43M!`3lQ4KqikVyT%udR*{2q0m|3HXyDbGQ9q3Hag5poY90go?7=NnGGhBUS2q+QW$;z? z6=;WIfT9t4SD3O5g?Ea^Vr})E1Qa-cdhtuv*O1LtlN6Q_K z{Tz0Gpahh4E_^}=20ix@vN@+r*j>n|I1Rh0Wy&TRHhkyS_3Npy0Jpn9dSquLHb-Dm zsnbOiU1+(AYMpDVtgNbR!OSj-CAyc@F!zCGjp>?|aJUAFE!6liwYWEm!Ahsgfh+fY zX|);Pw|&Y2otv+lwD||#L4tmBF$wc51>W&?S?!&W%oxmcLO5(wjq!tjnTVReh;{t4 zGkGb{u(_0MBa{(iobCY?Qaum4Q>XP-_Wvulz9in8P1%J0ous=AP;Wy9&LO<=yAABKQXAZIYfMna86jM@fV z4@WA==vJrUH1PUhdxSDT$oFZ$dF6-Q4&@v(wJoox1XjbputLo_c)Hln#7Fm)Gp?x|5KY81qj zb#)&UEe)oc&B4wU+Gv`nwJ=5sw0p$^>Kmzy=p0_b;!V|eOXJ`{GAd|kq%v1TKcuio zj1L75DFadh@7AvrjX#`gS&k6+S{cqC`8$cKl*=94ihMvJ^^YFCwMeWe<3ta7u? zppyqNZ5z~ZMsp*V8Vg`L$u+br3X{v`8ghwJzP4?v)l#|!`+h{VQMmeudqiC?D3g{r z)`8O_N;4Ih046alwGC)ObXqh>66zAd5*;gUgx-q0t3p$89JY%uxzt(-t2UxB{V}D= zW7M`n8x1&iBO1ZwF@;`0sdFAv-36tm?SXp8h(I*w@p|eWtzfH@C$ueE=`}ax3FqN| zukaeSG{l@Fj>Fde7&Ee=wHywKRyd0T4WMiSUv`{yNcw6>!K3tYoi3{23C6Lc1}ckI zdfT-#$Le8GJ{+z~BXzl`;MOso!@8)9TN2g;p53*V?&>kRm_K@UHltRBH-qb7WK7#W zsN%XnFZa)*6V)>&l2Ib(rz{zml>$TcV7lXZq!DyK8l5!bDb-$72JCKNTx6h(PR%S` zUU&|pqc77oS2PWy^S~vRFe37y!#a&hh9U2L#+WaR`-nybAQgov>!_O-Zl=RoBxrax zx^j+&XFd(R(+JO5#vz;YIl32b0pEbqni;anYG^}$JJ15Ua|LFZRZr95(PPl_a)A3Y zF3v+byoIu2u%b}kLLFn3Uc22|!LdG#o*4uc_;RRQwKfIBEERtJ0ek@evQW7a=GrE{ z^d2yKINc`3#B+Ej$2R7cX9u@kyumR{sFcK5SHIE=SL!QM;ZYj2vF6OJo2X(m^T;n& z8EjeI7D(4(l{YP&o(ED@tn#j92#8K`%5ckK5R>DuswcMx()Ktkj--Gv#6hMGL}Hxs z{+qu4a?XVnmkN^$FJtU%d4T!mzk$>tUU?6%P6X2X@ru0&cc9Jj=o+OCUjU6B>~qxF<4tkR0egaaD-&XyC{XvwLA<_&iiR?qB2ax?I+JfOuvpCAakP9V?xLQ zPB95iC`zN$A{Z!BwuQGY-h7gAy{Wmp5!0PA#yU2^{ICXsPPg|U^-oepj>$d9viC|` zF%V&-y_11ayPh$titJmMX*fDD|KiK8ga=XJHn8KXOOi5ZSQhi_YSH~}u^2ug+4)ME5-Il?j#koI^%L8<;PC@3SGDeE{Wfo~_LaL6|7>dmL+ z=w!I;MwJ|nvP4j}Zm=#5uG^o3odZya%sMQOYO}4&a4*S>ixOm?gJ(IDm0`O*U4eA* z(Q2Jr7*N`Vp+%=F!bMpWb2>M?bY(4?wjLs@Tn%r2c>m>Si&>eu9)naZ_YyO33*Pl$4@X$bp%gTRt7qf_M+bxFqSB_{6j9Im3R$}7mew-6K z3xDgcQTO2KBbc%><~Ci0@-@^9pH-%zl{acp0qF#%n)yF#Qr>8$D8|HDIE`ectZS~q zVNFLCxg4|!*Zc>(7X<1U=~(*wG?aV`{m;#fqlTdweVMWeKus~2JwFGX#JJIKDOi)i zV+Kws=$mdQ$&{ju>rr$PlGb^cYg|Jf)f^Jfkb;XlwWKJ^79SuWRw=FLP>BSl#q(P9 zMy70nF<@VY53Gi>Zqj%r^c4>e<^^iHk10M6g9*`)Iw-I7QQhMRq=Z+cB2v-w9Zpec zsal zEjODQTF|o@6G0g8v1OZ_t_U$ zid1Z%uQQZoU6K{fGfwj}AsAnZ6v|+^c7@6_l-|94y*ZyW)X1z+7vR&1G^!ZJfo)O; zWWonW7-?-LbaljsJTsLZJwtpDtINGB7Yoqp_n%@dhJU&6fA~;M zQ?wc$TV0ib0~EhQ??PfEaIPEYb{2M5)CuG9D~u1(ZWqy zj9A#d5-X@#^ZPK|mx1iE)?2T@#IoiN*v;jM1zn zlNe1hiE*-;$ugNtk}(S{xPS}dT561GXhcL>ng;qJvNVbahziKQ*(@R`OM{4rfWOZv z(3$uB{@>?+pQpM$bLt>}$y&cZNh zr;t;FTob0!E-F&Id0zkU2x}zh?nbGG=Lc3WAy{+RB1Q0dz2{Rqj)KptVDv)?IhzN% zQ1F>)-E*A+lbaBm5QFUJL^-6FQ#lDSWp92yV0HqM}$V9A=qE!4|gdGk+ zxsuRa6~r6bB8PV&3_W&^P+${`T33{KF#3&#tx8Z2n zW)g|HI1$+uLzK%jHOAmYS}+S8F~T`d@3qQg2FE!clV>*6qYPb|LlkWthUNvRM3oFF z==4+IwNr>+Meq8>5;CGDdP1(%#W$qw%_@vS3DPCEl-f5|1m)>H=XVpu?eahyb=%Tg zsxZ|ahyzsYSY9UG` z+T27)TLd#4gMHIU3b|#Lg`;g^Z{=gar-NEy5vF`B#11N=Azwe;wMe1Z=b*p!iWqlM z|E_CB0#OQJfXWiYhKo2^h&nFPFXBuGPcJuIg!u_h6rKgx)Fvg0XAAU;CvG`GF%+b6 zP$CPa4>KXBM7h+)N{Nd)aC#6ZO?ufrdEq1E2yY?eZfY=fT)p0cRy=v#s0oVIPRP>?6Oasrg!M$c{;LMV zF7!0GZbu}Cs3*^rVJKvrj{F4Km160ePXas=BcMs56cnagA|u(83~=4A)$~Xkc}p(J z$}lO16WzJEBSbE%5;2Wb5ydrOU>SR=v;q51{Ig15f+NGYGn7XyMo@u7H?i{UJ|k=; zde66ZWrC-@1k2iv6=x!a_z~K>N>m07xhhfk4QNdkxXww%wKCUo@FIxfS_zHlzhW`2 zQgHHIsvqT5MLd21y4*>~?ef5qG6b3&4_k+G=YUdZp6;wjDb;)W?mtWNB^X)Z618Jw znk71nymKUq0IHBE9J#N{K@4qEVOQaG$c9nKJwqN4;^Yr!beF5*sXS83lBeXwqP=q| z#H+9vs~|M4#4~c^(qlqzX%ZAqtgGA@`8;M`Q=wk`2<0W^OqzT+6XS48I_zmSez|ToB94ao283 zu2_TcV@bJ)H}rzknRL0wfzfJ7hmKSchsR;iv=h?QTq+0EFHe+|*trUcO0W)YBBaf&EVaiXR-dF-7Gf}! zi!qn<%lL*0@xvwk#4&LdkaNCmukJ3hU&-k}!E=eiQ!%wPRfxn(`e)}Ht0YP?v?_;? zYkR9QkbeWD8i?lB1KUWK4b75)WmiCzc*LfE#3Q8&T<6nLmvi#y>CuWR@vTk2aDMnD zN;Lx$$w@+*^7bC=P0J+JOw%Tzp=D^MiuR)0W-Pvp(7xJk7#^Fj+o0PAZInV3nmy7c z+^b<^3W(x#3k{gweilZhNruDZ&f_@7j$gHSty=FnDzuv966Lb)$T>_u6y~R(5}DOP zSFNAyai9(q=VKVTJX}(5lB%(@!2eiEsxe6?UfxrqA2Gk=GDS^CB6WnEQwH=R z5!rPS#kFK$VVq;Th52_^J<0d>VtrIEmepXX-$E2^bxTBNFPg{i3PSEDpvQUl){VuO zxI(W8YmI){m8dX8`p&^*>lVSCa$fn0V0(5Oq zqgYvsHC|++SW}BCR5XgvTK&R_VOJ^5vsj;52x*G0n$U%rgtg}}u1;Ytz>D}?>#(Wa zaZOCG)6ZLEy9TaPKFWAH`x=_3lft}(8o3F`?F3ZBII#AtM#`Z?b#21trT+@S{FBin zqUvA{yPHII9n7Gor{WZjR!G?k!+9!p&mLWgMaHX%P!An~Qer=l;S&xKG7-hyd~aqu0@b;Wp;tq6-VDX*k|}iKM7JKjwWSSo z&&up7jNYp3x`898Uc`!mb&4V`zX5g6Amm;v{Ok4i4X>eqTWn>MTpt|AM5NF%txZJL z!|dg^i>vke$6a?^r^uPG{*l+k)GPXNu2qt96pIF3hgfz6%X(7>$=J~uDIH?V6?EI4 z8zSn8e)z(ZH^6aiEbhcUl&)rULj}>aO=#{G7|bRLITs8lUl+!kUnlY7D&y-+u=7^d) z)RRQ@jF$DKg4kut5$eNwqK3HK0vq1h6Dgj#svkKkp_h`alq29cwDLTKU2h|k<7X+_ zEzA-1MB_GSXismX2t>3MVSPl3!JsfpbQS~WBq6tyfj+ku+H1QJxlHowkb46mO>O?Q&H`McOpgaRs9U#iaQW>Zn+$amcb(_$a$0QC^C#kCmoY01Sp4) zdpQ;mXXW&d(Q@_>X3Bb^J7;zm!%ALmtUz`9WSm@dd+1t9rxUbvLfS*9c`_QVNYZPX z&@^k0PC`9yo~s&|ZLp@m@J{igL|f&f8Q54{#P-flnLU;w5yDewhZ#6*j=n(z6|)c0j9Y)y7fIxxHL{7xi(z+K2ss%`sqK!Urh7IJrxZmFlPDC@2@+MI zVs?o-QJjE{kaNqkQM?E_o!z>D79*-_G;CCl94uGS8;L~YW)!Jq<4{27(-?D@H``i} z^o{`G)U2QAniN1n*T~2Rh_$7X&Gdu^Q}CyVuUqxMdFBR#P~*(qLZ(@+0cw+me7OsQJ6Ey=VPB??c+x-C?qbEuhFqHt*PNkVS7ar29T}qW-65sB+fc}aj%uQ(3 zbVAxIm?yHJoA`j`(RTeR_x$}tt;V=L4sEO3FGgS2KeA}=?-c7gG%}o!HlgzLg-ggK zfkGZB?IBnaoxRqBnxB!&k!#SXBH}sqNDEnxrFho?u^nkGP5c9N*BIE0{wo6`zlLbM z8XDXwxlsd4ELaGXbk9NJUIRCbkaOa|q9GMlDCwXW(t$N({XsFUL+|Ag^e0J_z!=gM zO>Oz7_^3ngF|~;}y#6fOMo%aNV>OtNt62_pk`DzfPA~rK&=2>mky1^_zlD(IN{boh zc5eu4b*HUN5P; zb)gIksQ&95w7*5l)YjuecN+{OUV}>N4dVG5`l$~W5XI?o$H|i1iWaC(J%ycZh1s3i zy+tJ#P(1uqdixFia<8jl;J8L%byOvX!>vL{9|BF&QJV`T>O3S|I`tDL$Awdh_0l|a zLOpUQ?3OJR@w^=TH(@J#!o`YCy&vBaAu2od-*LYq;*Fd7&w0lYapI=_abI&JV(|`4 zd+GfMgQXcR%TZ(t5IbVr{Q~=V!&~&k~*A;vR9#D@?(Umo7Sji zF}_>x@n)tOGH$nJDQ?N8Y=>>>A}T+OvAQmnPy;R72svMs^8k+RFqh* zu*Hgv-TFDc);LJJ=0IH{iVj23;*oa=(Re00uwJ4#^vRZZq8*3j-7nD%q#HpUv6HByqOlsFE3dzNV*YKcM=cggya|IaU!rR*&_0X! z=r(pC2NdFkph*)Xx&bq7lPCd^TOAkbQG^Bxxh373*G_jB(0dK3pt>gC8&DY-{_Cuu z4GqCMnXaON9Y-3LeBs3Ls2|X|tEDW0R9wRJD3Gs%Sazf=+p|j4Ki{W4oL0@zd z$GvkPPIk>%#JK=dx8o$Ge+f!)@TAz*tDiHXj419`>^YFYCI!t=eWMI**>O@_>eVlF zOF9LIlr=P6eATC)_-sB=U7KWoQmTFE z;|8L+g`hDaJuUM3^d9eKNX~I6-$j(^7HVrJ3cpBp zErZg(Di=2N>Fi_-q9jQ>b1%>&Z4H79BD){uE_Z|J4^EPFI=hRq06#W_mkg6y%=18tXp5_F&2-5WB~)qI}hZJ0!I&x^UL zkcqyVE`Z`3Hy~;(#EOO}+AEkfQ&3qeg}4=Y)<|j!3cn#2RM*Y{3x)1L zLmnWSrsl>)SZkByH)36b&PJ7U&`H@u<6+nmm8o*YB~{2{zPfxOHKH%|62+t4iwL>q z*4!NExdL#zCD(vu)Rv1B;}FI}okV$ z+u`L^<(Hvp=L={f<7$&bh1iiG*2$^`3H2oUT`xuxxI`Y4b@6 z^CX%MBuYoy^psQmwM{6%WiY}kNTds!w|t3Cprls`IVVE`r9cut1B=Rb@U9X~+YRf{MXf*~eiiMsw+2X4c%c_Kobb@2 zQW4K$vC)53poOz*M2IG2s;{n=;+0{7+$&KshDiz`O+-U94FJNf2DEPfRfwwCrQ{KG zd3YVgj>3>hCp0wC9@9c{X8DWW=!C)$N1G2y2I|;HA=k?`k~(pnJ;SP@Z3iz?GH1~b z*@T7~q%xnByGs)6!*tg`9Onx#Z|qgZ{`eDi;Ht9GA!OM*JokWd>HUz)e1a*=h?UUU zkeradkUj&l52?T}yMq&@I~e`MO&jsQ-nAvHy$2Qu>xTWS?!ABOS*78lkcBQ@`cyWk!VjoDsvn1$|wn67+4z z?}K?6(Ime13t7(XO(N4T zWa;x+&EO82J!baQ*|TQ9I2-E*A~^jv``6jO%>EhSO)Ut!`p#a}wW{k8ud!aKUQjur zX-3Z+iv(>g;ywS65pF@PM610syAO-ER^jg-vWT~|inHKNj8a@)6;LvW!drmwF2h&Xg)Do;bRCqTRt;`1 zX-?ypt~AXl4LXB3u62@j9=~TnyGk@(4Ae!)IZKnL$p$YMlr0^ibzO+pICBR$o>xH4 zk#R4`-$MMBLkh22n6*A+;=DeR;zgij+@O?(IJh|sc5rnV?*Q{l6m5q3j5&sLqz3vz^iNIRrkHC z4Ba}7>-@yv?9f+uuAlN=cIY#jDSJ1^BDM|&U4nJ!V*-QS2QnB3|3NhAW|4M2^Z{<) zEXvM@elsy(D@9v?X!k(SKtf#vhU+N4i2i!tFs|PwHe3i@PJd9hT?l}yOAYu zMV=C%6j^s!1^blu3POizxIIMqt|T1&Kmtc3fXuDCU~kFY!b(7el|aW_eKI9N z(xoNhMtkUApUNyH;f2Ul0th!q;DJmfKwbf5B!fu%BtTx7Wn$Cy(2=7XBmt4SBzO+8 zx!FJO$&sdf%|&Srye3b-;LlYT`hy%{<|&F#&5 zZii0d^(|t`?a*;UgIgisbZ6jVJ|TD&>Fv-pTD=|gf06Po5F>j+pXB;B@m5dhFODJY zU|6`AH3&x%rcrUj#5X?~CWv1i5femFZ|HR2-|ncG@eO=_)d%*_)&c4Ds@4R~o*4tx zy1fOu-+u)>i*KWWHV!n59eK@*z{ei`7wtLFyg^$DIX)og)uH}>Xl2*cY{3{TA%Y?3 zFd(>o4pa$|?J{E@T_=j8p~}Lt5>~I-1+CK)RB;$ENvqlcnw22`v6cCpCFCfJJ?JF! zDW{-T29dU1ilu#lx#uS6>Xp7aL=GlQgIh0&GC@;6pV(G{UaM#HH-#VTZB@@n0P<-!%URODqdcaS5 zS9~m}wX{ysj(`ty0w&nFxbVm{(#= z>R+z>I@1uL8fL5l$>mteK$9{B{~`z$VtpPn$h!7pDHXP+>% zxm>w|NUBKYv#~*(nPZsBEe+!O9K%np35|C%sBaWMK51y=dDq0MrwqHs*qgxdKp}7) zJyCq~ZjPl`G;M7b9&-&HYX8kG|%9~t#*+y&rrqn_?*|% zhL^m%+9@A%EViH5fgEz}RejM|3RA$D-nu|n_))C$iNZ}WGyxHci-$?SE*_n47{!A- z#H;fSYg~hG5GOnWrs{@ralT=RYT@=SkTix^+Jox}4=ucrl-!?eF?L8u9O72uc$COJ z4mJ`|$D&i?5?Ewn6=vPaE@kDj27DUY-YvfNHY|3t-iEMR$JSzvbvsTZ`55M?gL~pc zueZTVZ3S4l(D0zUtp`%7UCgJAKrt5~3oOHwl?x0DRS)QN@hE39mL$Q1`qMg~6DNEO zPjZ`1bodw^QU!}~3k)M&Olu)Q>7=byo_)?RM&%;b5e3Vrkagm-=M5h}Wm_c6BfcQgTo`tyt0(4U`ugP6b2FrMQBpW~6C+eV6r{BjBOi0Gw; zVagv14XahWag!Ld2%4F>Sy{Qr@QupV76cJ~C=S^LiSic>FFkDCMwCtaVWSB-{z)wy zbP$Kj6jb?R`~@pZ78`=FqS`4+ml!TgYuH6mNR>D3CbZ=M_5p;T>XeX)FjY5uw{r0% zL$AuEcpp)qv^V#O@>dKG;rnTOUNuakN2zDLY8cDA_A9TwYIu$F;y=Z~*A25DJgKJ$ z$h<&;5av@$;HgBsK-w@;I4m`c;b|da!cxP;nQbB9IPRr#vtVozLJ@SLYD8k2f^|KG zRj^B81V;XGP|SMOFmhNXg<(bdfzY{;HBZp z?{Ct;4nCsf{>89V&6}cy*E@#SUbC8z3eUA;FC!5(MHeBe{*D*|sDz#Xr{|iYC8DOY z5^~OIVpXyT`KV!xlJbt>DYc_M0jyenxb>$HmFRuX@Cn~?LR5bQO~Z@A{&?T;&~#lA zBs?x5CT-~Mt=&yAW@JV@6^4O{fS!wkFB|3vufH0aJgZZPbqMdcC7`ZmdgjxcA|C$0 z;Pr|j6{P#?@L~fzUnGl!lQ=xpj}sj$u^el$_`JfJnNJ=CwYTVOu8H|nQ%D7CuCo%j ziFw>Ac6?xn9h#d4g44hV?S^EUc;`dI=Yw-kg04g>R&n=q&4RjRzz|#zm7f?!YJ+pZ ztq~utGWaOopBf%kjoERLvZEbl0wEQ)r1=u0qaQDdwVxSAc<2gt`qRUf0FRXe_;*FzgWxkwnGSI z!G2bO_dg36MkFevsY*%v5|(CKb~Pvtrx3%0@k9X?N*Y`PaId6#3hC5hoS$KVlK7S3 zIhAkjWsrEN1${v1ZV7N}?qV@?eV_yz>cLZCzr8~OSfy|Y(BX*$?&jMdsmND%1=M@_ z22&`Kr?cbCj0(lFA`HUyY8$Ije*VUQSEyz*iap;N_Kvq*rF{0HO(j4=0oOpW^MSTz zV&y7BoKSyfu*?r=0f$qMMM^}PWs!(lIF}IV*i{M8!kv;wogdIDZhU8$;9_be8E6}x z%$e{{!?bDFBmq4gU?&c;*Auu`4-iNML7Q0N=TK-d<+ttLBA28r1YZg3&Z{5^?wY`{cBZ>rFI8u^eGj@|* z%40toMydGiZn5+y!zb$6+wn>Qfa;-=K8gif)h+?X$%Z?iXfXxgE)q@*@5Cz$))@Y- znz7x_f_l)sk5GxOc0+Lqslw5$1hl8<;3EwU=PycsHcS|1@(0yrUM8E>YBEd1(qYdJhUk&@7tK0~VW^2&4VCK_I*zu2p z$cJVOT>ye|4&FBw@Z4bK z_qB$Ns+atBL3U{WT9L7>fApuBj0QbO9JlDyyGy+ORYE3FxgiP52Z?BDQA@}}=$0Bh zC+T(r|IcZ550O+bYM~PBqXmO<#NTjC&1()QD>fPeRgc^Mq-4n~2IvXlPODF*M1SDi zP!~e9xMb$DO`=qc5q*f_8E7!6JPX6XbRF3EsC6m~d>`E*QL)MJ((Ad0DB@xCN`pk( zU`gZ$zU*j?Nzk~2 zJBp9o!+sLqZZ$Y5rS4&qv6W0v)E;3gX7KKvhd=NMQ*qrMW#w~Web4i?2bGl@!ajYP zZ`v&~)51EqPADlS!}jBKdi#}k)5CTxe1GH6WDU2iR}S7fl%kp)5@E<^_q z7&^@Jf#DC17&&S*wwLmHi}~D6-dU5d*=5vt(s)^VY5OAH^FEt+C!>|@abM~6f*t7|t%z)Y042pIVNj-|C426b_ zdjubo0AVsw@z+qFvqaW-`@a6#t2k_?0H6Ih&bMUTnX?|lx70D~Zvox&2^j}J&to&n z)fxw_qthT~SU2LT#$bUf!B`rzpg2Ay<)1{+B>frGcq{1YXW3%d0)i^4lmtUpGM~$Y z96}Il70lOGC9dbtj&FHvtFrj3aEx-$78j@aF5@@W&iYyTM)eoAU4W-xsLk zOAco|&C_-&`uT@j)I8>Q5xn5=67|{xrsL{Qov z8RCQJNH@_F80n;3`Z}`hL8q9ge2vSYQk9gm1V;M)oma0{*4~KRr{=n?%BWkBt+RNW zT^T&>=qqy^(<%!!E_<~9NmR-F=%|TvTdlI@XJL7OPLxXTUbD|A~=-VC@#PQMl zpdC?Dw7N71ek{^3QQ6ZEjel#^rl4cA;^aShUdivSaQc5Ng#zztA{G z99w8~Qi>KD4`X;95x$Fzf93i}QMJg35APfm2VXS4%1u$C`9#jb4NC zL3B0_^PCZ+cf`uY#)-mjv2nJe?idILF06}nLz4L3;PnIr_#5?XjAc+ zIK}p|@fn$fxo;Z}a$A=2?J^_gEZsTbx*Y9hIwzi9ZXC^X&nfRNH@>XW>T{96i?ZIrd$G|$ z)X`aT-#{QE{HQUAX2Wo|7Nv;S)Bb+nd(dqypMJ}|BpuYX{4R*rsPd|Ty|T?u+1 zUm)CX$37&ctu$V7v0VbGK;?+zWikFE<99;$Rk%j%{K)t|w^oa`kBrzHAnqrP-0a=_YAb4?{7w5ZmSo*9~*Y z+aSLD#Q2g{-w4UaMd~L;uMsrkSmoQ7reVBHW4a-jD2e~DnB`-9$bowBsu=qz+7EZS zp8eD~&(VGr>|LnXbH=BY#7~XysT_k_K+2pc(w>Kw%=z3nbNHa@gH;-r_~9xp(!O4Q zzv8Dedb#pYMG48eY9anf34JVwE;&4`hakv`_bXs(oyG#H632f8aKu{P}aV z?Qx#IR#|I`-mv_kTyq0VOaC!1V`GuNFC5m-rl}8beTE3mH_f0gW2EMrrn=D^ny=YRBOK^&9gg*;Y$tmQa`VzK;j_jx z!ufq{Za&2BRo|-g)|>X0?9!l#uR_rbq!G-eZ4ogK zk?T~xSRJ#5tF5=2mHNNOWUAD`cbb)$uVapn!uLd!zi*D&KbYGuDo*<#?xZhj(YSo) z#>5+&O!Gug zz*;Hd|A<-6^;KfX!I-DGtx7C87_%SW_E0V#jG6Z+x27oL&&SMj=DLgGuO%@La{Wc| zQ%TJ9(YY5}2Rd5ku3{(Q&J8#p`$dsf5_6T?3Wc#0iRz2QmC~3c9RH4ctSn|R*_2<( zkQ7QM%3@v`1HZQ-QN`c)Gb+JK7%DHc*yvxVt$Q&U?W51aDGeW}BxvbL&A-`HXq_B>kUv zWv$LCRu6X#t`pA3O03vnv>p0Z=+&m-%JntK*iFt;z z$pZOWPsodp;!F=JB}>dpT)6(6c<62OCT=<}qTe?Eo0~2uQvHqe#S*DFOjThHGFwf$-)nd$t=KW6g8t_O>(nw9dN-;k^{zn%? zslA(;Nuy#H;Y#3c!}$c)K~K%t2GuF6SDMQlNkbQXZpQaP>|G*cwHck;t!(|$JWs>* z{z}$2=G9sr9E@)op_y`n@fAyRBe(7lAO482Zl^f-qZ!}G*eObWG)Hp#E@j#GVB2O!2!RAtDo?9;Be>X4Y z`U-L9cQY(fg?R9Q`6(w|B~pLRfr*eGOkQH!)KDkke*pa4O7X`5^Mixz#NVkJ%Eb8Z zOuva|{xA<49efEiX$!wytzs!~R=6xUA9Uz9f0(C0xt0BYnCGGu8 zSFl9;#L`5FR(qp8d_nAx&id~H;vc5|kYc&6z2j5agT{XXa$kBGH6YF%1_%=A!PqA-{U8izt zI|EWi5LV3p?;Td<=N++27IABll2H=-3XE5|;!z&^t2=HJ-4wg7#ja5Y_uf?QYl{7R zxTE!07jC_J;zPP~yp>cgy8z1+Y zvtxB1WWq+@tAV3ZIX&*qU>K7`4wo^7dPcW;}&)bPBTSIFRw6rLyX^ zxGHCUy;MB6A}$VJxKX-R#QC@mZo5uGt1P&|>)#<3eH!;Fz62w7e;SwMZ0Q7R&u%r| z+^YH}ZnEP4S=`szeA5ax;;9ZrXc||;4epMx=yc^%> zXtF^fN+nFm@lhCLP1Okg_eU z9kj?tl)=LeOnblye@N)VUAf1Vt^0o zKGS_bQTkHi3!ZV@8>@40*`gNn=i;L(e~sI<3#SS7LD*-W0}t*EK2ekOB@X53GvTgEgPq{BtcBe zb(k%17@|u?Xz040N1t7qeCN6ihbQtu3gl@?77zbsS;qDFg2!)`zdGttA&J`nNPmpd z_nYNoe8BFc_*iH8j0c|*=X938J)ld6$l(4bF?^AbH=a`S(Wi?S*INFK#gRC<*7C^x zw$l(A1fj7yDdK}qo2vaRKhh^nfAO<;anl*0_p>}ZQI`q9yAO7tK)WdH+Mhap)l7#b z%@i7c%Mz~360iGPM)9O9@s+=240b+ZtH0$@Uwt;>Xk{ED9b8^Z43qs@10^xQ?nS@7=`3}GvU<0yLnwQ<1L-4Rc(vlwXiWm{+2 z>Y+amIcLcntMk6|JdSeDi?!=5_;|?$k-XkA#xvsrB&dq&yAE5B3rgF1%R5|~TL7l_ zfA#No0hZA`qEKuPu#6pcz7Sm10>~5KJ*da+LUB64G6nBy7xn;)=Y(@b;0&R^E77iC z+#OoEzlPHtB5RzOV-Ic{7l~m}yOd=8h0+(64T-y#yx=(G&!)e=@&anLIPhWc#+gV2u9KAB>0DT$zelLO%fUdD^RO860k1$t3oq{XH&drwBhSgRQWef_{ zN=Sur`&Eg~&6dYM&a49AzdFB$!tSzDWrL!qR%XMEM53#8Ls0IZOMs4dpzXf28w;Tz zmj0N>0fsC<3^oL9D=!?xxr#(Vo*ag;B5+d*csCeNHQH(e^xs0^!eRJ zDWZ@@0vfa#m7K7nPNs@^V?#B9>K^JtL6ABnn!u2m1G)z9<{e*bdM^;!ZK$sA4(m~2 zp+wG`jI@}$)iU*ss2Z?o6b+%YA%BVpPW?Gi&Xp9V=Ikcms>ARhCx3mm)lzKSthR0= z3e=`n#BH^_FnL=Y#e&WpAV7~ep?hNq53)h|n3aaSPf48^A7mNs+bJ2tkv(0QM*}WH z(!JW7HT02Y$!jG_eTe9TXrW9OT3sQ6({LQ|FzeW{NRh&tgK@1^WZT@p_WwG-)iF+r6ZZa5L(Jy?ftxk4ldJh4GQJseHoV<5;cfvXU5 z(mjhm#NHW8^^(#!+pduS?Gn^LvO2V91fc&_hvmoB7lB{DTC@@^tb#{vFV0k{cW7))r1wCy5tn`OqBCL(xHA0y7dMJAo{ zinu0jY_lwUqw^YMH0T?Y$=C#}wiC>hP)FTYLQwOqBehl^;X!=^X`%4J%^)}p5WKO% zXcn7-EpO8|kE(+$@6$KMy|-KD^4wNs&34Oi)#O(fXxS;F=MBnMvLlWjegCt(RC|Qq?2NHvpOJ;Ob%5O{ z*^7_e+U$^*`suq4z3CAX`(s;)9T-K42miC?VMA`Jo4Vt-mM>lV*?M9hiSidU(Uu1s zWhg63R8z?sqxP7nfJQNv{3Ay3EcsbR@mKO2jp7%{KSus=N85Eu>6l2ALdQg@6gnol zq)@bYAckrgO$Axnap2uIvr=md(ln)cQ~L|DlA>oxcJ8=O^uC#?gSyLoQ35)-|RpWCI0`5Jx-R*2 zL>|h>8>Np5wIj>G7%{|5wT}^xke?;};f{J@Hpbv3>mUZ2#bzmF#>>`8$SktRZ#0Vr z$&VF|v6j()JrXMmSUzieQ)+7aY{UC+{cFNN0Vug_VtY>e+Hq1!>U?IOI{opf{gr3L zz50J~ZEaM}II$L4@FQ_TPkxs4QBGnu#)&E-2F8;=+)+owBk^KX97)EDr^#=O7w?iE zXc7M=|A1r2p`bDpm>~WUPbEwc!Q^L2AJrn!s|n(KJeGZ% zj+6g@<4T!3z7}eMB)*(G#bO!dd-XWAbdM>*x-IoU_{Gj&##~C0gJ~Q|Z%QPt`OePTgJ|sJYmUR@5f!=eJoKwFk~2U8&8P)6jW_f zl9;KW-ba$~8g*)vB=HsbjY(n)`GLveDEUW{MYiN8i$=*$7ETGoPZ5*g`yNT5!mKoI z&0KxL`|{^Er|E+4?=OtL3E5>y_JSnU@_;1oi&5`pP4WwRAkDkoamM+dTF3XN zZo5XAr;2JSYh&u3<5Xm;7)$;Ut9X|DEUWk{`Hfcbi{z(?-z7gyB$A(fR z^^UBLdTr|y1E$nU?5zISPd~LW_pG;N=vyn&Umj=xJ+T|X9_{jgyFKIfH#y$<)ApSH zuBokG^;Qx;@RZn|NL4x|Oyp;u5*HHDtBt2bGlc`wh3g68r;BOiXQhjm$Zt#+UyvVo zS_DY`X>l07Z`Nt5OmM|7_LO|@4$ab+x(^K46zdf#j%2UASl#Av(K})O_={_52I{IO zc3=j@c2D`?vo9}tXa3k`I`{Q`{Vk;<_7TaRIs3;qPhRwXKUr&e>*?YB?3KjM%8Xg9YAy*n*qp)H(I@7s$*r#79X~<}*S^{*g1{Px7^1f9iEIZ1_X z1MR2~LozIr=^Srvh9%7JA?gGy-nnv zvCO2$GI*xtM@N3gE`GjX8NtKb6mh{4uHuFp!aL70$??_=r1|4i;gf3_AvWe&K6qg7 zO;DU%|1L|21#1R{8~C1l%Ok=)-=a|-$+tYE;(@ot=NBy#)Y-TFMes$-d+sNCsC0{& z&uIc9`;#1x2flg{^q4kqIkLse1}@Y*r`KQ1DX@%FZ|L(ED+(-Q)j0q^7g(mNjd%P- zWPxR*x^@6O5~f=R4Y`{T{I~C>v}_rczH8Tl?Vz3X#y3A=akp07S7;gjaugAHTsj^x z@B`9jWT9H+c+P}EZdFvrYFSad`4E4H@ds6P1^BXPuS=cRV&rU>I!-G;((^h_;V%y9(wVDK(V&Y~CoIE<%r; z+$cUOvUs>$-$?19EAMO+x+2R+7h?bsa7cVSK!g`rW{h7K2m+rz4*we?^j~{GJB0(e zh&kgoOMHFC?*TEt*mBa>N4EuZ2ikjJ)f`NLE3WSyRWoy-n*Ga%vypBp7Gz^=CH8b} zXC2szG6z;SPsJQ2ah7zPv$h;H%U!Kz_9`{2g?p%5#g_JP_Tml=3z@58fAdzeq(>Qh zCrQoLH>18K*w*6@VB>KQd(#u{?)Wpdy%dpL@T68PXJdvl_FEJl zW1Hi^ZfxLeL!*kVKc;5B^B8lhRI_>wmW*%|Twa`(Rl*g*odJCn{66@PD_WKS`QIUPd4&U; zg!JaYjez?Wc`Sn42zMCHW0nJ(cU;R{O0~XhB?z-1)O!iSHZ9Ak(y|EPLBOkkUnB>d zSE*&M!%s$dKKK@dFTlS7|7-Xw;P$|M3>O3$0ap)P3imGX>u@uH$HSe1i-TKG<*Q{J zpaaZ5;g=(^!SJsl{4en95PlH+2f*6{KMF1g_+_|D;C+Syy1_4m^8;-K z!r#IDim(Q*8}jSmz5t#IXZJ;5E(9J&U?ki$;7rg$;p|Ajg77K0eQ=xMeub-nI|P>t z*9Et~TFZ9A9f4a9w*^jtGr>IuHy7>)xTSCl2qW!xqH@M|+9&o4O z2E*0BmBaPGJ&8zD;q1Ue;g5yW!c9Z?A-GX+FQZ@Ih8u})U5v06t`K-CXf^PEMdmLf zP7dg8HuV2RfIFx~Bm5A!8^x&o5GX1XO9$m^gK}MlYlC8yK*2KLVnP2JZYGp&I-GAX zW1j>t_V@@DYkXM4@~TzrrGMZgW{;X(f-8Zek@EnC@aJmIro5nLPD@nGV#Hp#7ensN zFjv$bMg2=%MN zq`+^4KkgqmYfMLtF2H?*0{n2jaRe%I0)Q>0z{*9$749l+O1~0k+~ltZh;HJpQSvyRnk14kB3|wUeN)%6>_hi zP_vKWE+Bk_x(ffd-3R}z8!GlPdt^N?#o0h6;;tOkCDFTgH6-aI>W|9@)6RY{KAIgS!~ey=gV!Jb zzciXn>{~^kfQ~ON*Uo>jRDWEMKNR?_xO-4_^uKX_= zHQBWPA?Fiy5V=1%9mE-Mc={F3!lD%7V7tZntz2T#!MKgUeez%9;4Xlp3k=<##MqnB zPr$#A<%MOPo*3Iz|C{qSZ_(3k@lvPQG~$hEN5}IgM~Q{kEnZU}h8=hXkza*-4eoWg zrFgzqk7U%u#MdeSADrnfg0EX1^wotRG$FzVGr&<5`zPFcaCE&5w@f0u==ivXy@OOp z*l{_CMDVduP#xzUf_t9?cTOrGM34Pl%_5#+Z0~gxXf9(Ppaw5vz4Qhm_Tjkk*8t8OaMt@u z0cQyd;G;k*pu-0rhMj$mu@_KK=jZWmxGidS6#i%w@a2V!1r~8O^aZ>e1nIQE-#LM^ zZHw4!wrm(@Z@vh1L0eykzYGym7vtdug#We#pH@MHg)cGoRxxMeUS@26u2^xyGRC*U zgR?KtyTOp3z7$Q1{+ja!CIl3$2>u&Ssn}nz;LAD9nLApu~=Yw)MN2Ez{%xfcaD{(%3CL9TlZ>^B->I?U-VEu23F_8BnZHZt~g zs)pe|E9^tGfOjx90Z34Xahti0v#7oJn>GISeCq&XE1(;1h9ILN4U0Mitwe&?k1(eD z8)wHO@m?M9W6gL(0qM?!-Cc#ZCVYz>eDkN!%QSq_4(X4@0KuON*`+fm$za%`N3-#N zyBVAX=AtE#aXG9@JpAPa_%aaX7za$yEz&0 zPayNhumV8=wmpqUZ;;NT^HprsdNuq01r@uLsbcpnRG;0>riy(JrG4~0 z72At0IQNl?y?`1fe~ibNQZ(%QuT*R_!kOP=sT+{2u$&C@U~TJyp(72A&ytHvnHo5h*) zhghM^=S+|Ir!es^Ll+%iz?oMoWB+`Pv#s0lch7~$dybk_y};T1SO?@U;>@z1v+!5A zFAG4+z5WIw=BU})x1peDp`Z^qtG%L^pX5%#?Z5h6t z&1mQBY!+t+E~?n#i=0`Z-KQ%!Q&KrwT+dk$1kKGbRw&TpkR5h|vrhOrw8l%fQBc^T z*LpacbqOohUe3;-um^`;Z_rCJI537)K zSWk^ov!~Ch+3bg5Wzpx3lho`BA2sWls%A3~(I1Zv1*3^?J+5Y}6F8eTSIs^}L4SQt z&B~C0ZK0a|0zdCHHQNMTIlNTO{@#tH^D^v?q3oU?sM#9mTFPf?Ry_hA+51+_{xJgs zqw60?2z~XHPR)LVT^PI;J5iMI0{peG0pIwcU}22Sg2IkN!F(|yQbW{iBNTrSl-n20 zSq}QF{m9IdvoPpI2U_Z%F>2P81B+}{v$>yfwk}!C?krcc4JlZ`j=+){Z%A>ggAsc@ z7uFCp|2u3#5&HC*YBjqGgJrEzGfyPeRI6qxL{6$xvuWu2sAepA(IP*#sPX1!75lDJ z%}!zpU_ID2Lz$1j&w)#&Pt!EaV~vJ=`iO@88~h71(M<@aJ+5Ji z=<_{KX;=}ajJ0z$%!UkKdRD`Bhhweptzj{r;(y7{V{d;NivEg*xnnAswiK=8i{a7% z;F6|cqu<1?1tsfP1|#IG{{L8e4=}fi>ur3z#k-QRkxlgiMmEhhU^di1fM{*jv;d-n z6bQ(n1`;BY@cR)0Tv1K2;ZlsirpU$y1IAqH+QEQuSvrVnOueRrWo=?v+I`h7B=1iYEckb25%>Oken?cRy^FyJC5^r-j?m{rJ&C0cy)zD<0PG~U; z(5CzUuEmVOHK%l3i}@cIKI8Zn^As|^@$XyA8L)ri2`%Pk)X2&IgEbQ}+EQpS4{d>! z&6#M<#qTtkcQ0%)2Y-#3adL}!zuIg@U`yl;^!{Efl}|+p=1*-gGhpa|87<~eRQ3DU zqeSR@iCHb?0)+o=Zi_h&8QI~s7Sn^P?DKcFn8kS7edyh|j-aOSqee3V^67h8%s7mu z>w8dxDDXWC@W69J%#5$!*J9SdoPO)V7So$*HoGovF{_uckn2T4D0v0)4j8!cu@CoqQp)nYzg2X_~rApscv&F6^t6HLKhpp9W{%YUPqx5RqnJ5=Gj zP3AxxDY88#l+Pg-91Yxrn@DuD_1bV7G^@!RpJ+8lpef=3t$5|S*^C<0YVydy4Y)gQ z0e||Mt>(fzjX7)JI<4jotc;cqZ8iPRDK7gK>xyfzu6TIMR&y32B(`cbo34v7zD=tc zfsDPiZL8U09(w(cTg}*~o6HA4X*JKINv7@GYPQ8tyriquOhD&*W^AkZ7&S0$_g2$^ zj2`i`Rx<|+sz2=0YVJiJJLrH`^W8rE%+m+An$J;dlaFjQClAFM<`1ob+3|^HbMi^8 z=I0pWXa7&DISTT|(^}2r7(S1l-D<8!f|bd*PM|kWoraR3$~#M~=4Ld@Gmz_UiUrDa z+!cS-VzM{1n&itE(sNtQIAm~EPpfH*P($-uO$a-CENnH^1yBS+4t+*;rNG?Xy=^TUW$Hmw_LqB>KyC1tD{)lU_g#!J4v-_Lt!Ox5O zo8vI7AH_DyS-|5LVc%ym7S@mUH@`tXPI?AgEf1i_Zi20rX;8Qxa)(b_%-!$xH`|Zt zZ?<{AziHp7zquWRUJVkutJ>e}kLud`pZ(2DBy=Za7ZTd;6YO9i zp&rODzH2o*{tE^^M@NHP8wv07X@A_*VH*x|3izLXhPWTKnlj`mNVx0s{w9Zn7eZc* zW*+wiHmzQ6HH#rv+pNFo{{5HOV8Ry4BFI}%16^PBH&>!6AAsEMFRf;mud$VesrO#U z5i^_2j{oj&&Oqn7zJHsUb}p`x1KZ33T?!feP-c4=h_ct_|=X%=AJcR$@fi|<*iN*K&^$ZL0M>d(g-)l2C zxy-EbMVlE5eBH`6b36v;zgKHF8?T9*f_2-?SIExGBicBB7SM+RX!(W689j-JFMv&t24R)`h)ckGGpEpug{P?dECBI?=0mk>|5!bLSiF z1|7(>eb8>EqGJC1NziVNN5YkF+715g()^`0Vb(qo*WG~$a{_LeE*_FFf5XM#tMwCR zQw;KRHcpt^(D2K)NSOAuadWzD!VEmU)w~4xYmANU$0f{c424VgPnez1LsJJNOef?; zkSX+>)ecOUS%`lD|f0ZyFVZLqob;5)j<0lA^L$Umc z4oR4Ife$=1VGh8Z?st$ooq=oYZxZHrSi+1uEMbB!{A>Yo1qyP@;R&|nNf4f1KM*B(7OVVW?=gVFhf*#!aX{wZPB!|d^^KPSvWT%0faOTz4luATbd zgvsyTZ1xHgW-nY4uRbqfPQ@iFH92ASLB`*>Bw;RtUhdL_ISUKIKTS)RuGeu(J}Y59 z!+d+o+=Lm6rn>K*g!u;wxZ!-%2$oR~FHD$wuETo!wM7YY6WZvz$53^+Q5gC}!YtjV z*}VFE!VF#=SAeBxl3`e?z6gwq`Sr^ZW(2NKZ@!!`r=vzDzLGEuPtcLa4S#KuHiHLv7TM4sq70*%r^mf9mfs#M}kA&G4 zRlDxH3G)o@Fn{-6!t~qTm`&bKm{u5C_k)D_Eqd>e6-aOi=2^%$(2Mu1Cd|LF)cxOo zCd?F!&aFQ|$#En37UZYM@SJ}o%%8DJedp7Jc?4q&Xj#$)Q7m(KH9Imo#hrZ>u?W1D~l z3|oP18Z&_%d(d%0OuCr0*i%S2-)pfPt2 zH0B0?#*G=^-Kh@e^0tNp&o*#c?I0tw#17$~qrT7f0fm?hGhK90s8wENq^hR9nxb@mQGz-?V(1@om3sp z4NLrcgdMWj{)EjBgDr~}t%iDI*S`?c9H%COp3JVV zF}IjBW>2qSsn^@F{&k-Tz1)G;m^;xLbAwpnZF)JF6=BD+#@uh!_`Mg4hYjo*GlJWn zn&&pC#_6+)a|iYe8_Zot%_obm4(!=5;1r-~?geVhdeNABfEu%&H0Bna#;iAuxs#@F z@o$5A1`p>hnIe0+Tc+{o;;n;vHav>ckEXd9rZG3eH0JcAG25($rSHGt`*!-<@w~Tv zqxhrMd)8~(cUf`Y)qBRUdz`*{&#(hn4Yy*aNp}y8Sxk+YR1Hh_C}AG4@y+t?u}2m^ zg57?Divv^Wg?CIWj!B^xasl4uM=Ns3(Wo&;qsAN*JNiz4`Qf$`)o^)HH}4#3IKH5l zPY-Iiu<3Yiveod(3$_{0-8Dsw=T?r!+z6@R%){enl#44!pu zhK*nWYJAl35DTF3oJqyg2cw=*0dt|>H1PD|laPaXFGxLCUlY0q7r!0s>S@>zsi&!a zw8^EJSej=%A8cvN2V3W17t4K?cQ;}_iPPbH5~ndApeY=5^GTW_x|yKHe1fJipO9(H zCuJJ*L7B#Uu(h@C2xdYrH?r$En9$1|>|MMX=B;)wp3~F_ zVm_|%3dE=3wqN6`@U%nY)b@QbAMfaJKIYMwk9!1TYa0phd5>1$^B#@)+(%tF&ZiX`a}Q8s-ksMlIyJZMi32;%L2wUWD{v29WA1Qk%$;tHxnZm^ z?=>~%z2<1luYO+Pj@Fi^;n9klmzH-6QB&CLMC@qS=B?%3d^bSjqtV71^MSU;e6X!C zAFF80ec~-oJH$_n%e%R((F)v~)0lg68gp+>WA4pqynb==I+$o*#HwK(%-`Ib)4|-E z(-?biA3@LVy=k6%a2j(DPGj!HY0N!2jkzbMG56*)=AN9wK{q$&6w%F1I*qwmr!hC} zH0Iu&#@xHpn0t5{a}TeMk6hl(&Ad9XyqlYP8r#i1)ib!sr^C6~r!gu=jP!bhjz@wF;3_n|fBezeBy z`x>+FYus2vJ=p1}g$JloZb;V%U=9k6IVd#dpwO6uLSqgJjX5YZ=AiHxQ}hHoC_F*T zL7_1Rg~l8d8go!+%t4_s2ZhEQ6oPq)m|zEmR^Xt}n1e!N4hoGqC^Y7v(3m^n8gob7 zVS9<1(9O}J6*yWn=1#fB+$q%my5?E;8gq%RG2f)p7;Q6L+D6lCo8diUhO=!n&$iKc zVsSE}+t;Wx%_h;9O`F`H1~W-POdV@9AaarvwQdbxbon9FC4 zxqQ}`%V&+bde+#!tfaaEUsh7#&A8_)zBU3k$>~aQC1k+9q!fA^`w}0O>u^5w(wNKZ z8aB)A@>*lAt~KWBTH)sLw{KFsb|YkjH=8P8JeSoPb6Kr1m(@4<-4vMwG-fB)m>pDO zc0`4ndXFpava$3u#p4#Rc*4dq3uvA_O=Hdi8gmxVm|ad|b~%mN`Uo+O2dmb9|En`zJI7O=Q)k}>S+yQLDtKDQzL-6cd9Y>7&PWpMPqI$Xv{4Ijk%?uF=sfB zxghIh$MXa+JD$dkCHxu}VI9tnsWCgI#_Wh1^UY1cc0tz5S2wi+U)|K0bCkw>^HO7O z-)hYF6gB31iW>86o{{#hXC&7{BggY)4o5i5cilBU>zv}gBeDI@x9~L2x9v3MTX!1s ztvikRa-GI}cTM93#V1DgY&C@Ml4u(Dvx7$U3>(6CLo|N`e$EX(;5#9j=ZaZlu7EY> zf>&cMa5d&~NMkN&HRk$M;o{4qFq3c*x_RwJW_dU3RAbhu#=JGtn6G4N%vUHiX5DMd zx>q>pX5}lQo0YFID_>()zQ(+j)A&`~nQ6>BF^$Y)Cc{gvpG-mT@%sVHI z`HGLmY*vlgtQxafYdFCEJ=?WL0JB{+X1i+4cGZ~esxj|7G`3CbC->A7y?m=}bHQsH z5PZMnEWeJ%OtR*K#g&_5Bc3B(^P6HLev6)ATXSG)o&)nDzu3Sfm~*Md51muI2=RWz zIaTvq*K5r6yT)43u%Sv_ZRma(=+V1oK`i@7u+@G zG^;VES&g|A)R-Ho8lSpB@kyjJf~~4~w(2auuyVa(&{onbG>=}f?^c-37+>>@pRRSg zqk8#taJa{X)0Xh{)B*kqjK}L-lW5E}$@=r~d;P1pdj{)|7{&;fVC8ow~&NkoNSGGRHm(Xe$Pc`{;Ph&pat6}K# zWwo90Y~OF!^G*1(u!wV?<>P}sMC#-5#Ou`h+f;k^Tf^lSmVCEQzj}CS)_A_NUkeB3 zJNq>}@?Lvo)R@z=_)mC?n&Zrw9xYnJAB_1dt{Dm7+lYIyb-{0?p55zBseK?jt4A+=fQ;m5wZ7Tk3o1XOo{#0NMUmuy5yLn;N zm>0&weU@<Ti_^bN@#JFR;y13)En0UyKufO$S8(w4n^gv_&fY9v(8DE0v9W=fZWI&uJA7dievOX?6vUHazt7@m%_R=4%2Q zO8lLk#@tZSm_IbsmM8>69)gW0{@6{-`nd--!Yjk*7#F}GPX<~EDQ+-A|3 z+bkOMM`JY{poH8L~p9%6^4_^TbT4Z+{j_49qGGQF3}jT$ZwU&0Gk4ab}I#g+5N^R4Jw_`_4i^Os9CJn0HM z+BN2Aui^OhapU>J9z~4j&tGad^JF)d$$MQSC6T_N@yCZ2_xv&5hG83Po=v7Pn@nRi znZ|4pjZf+=&WGKAHLrQryvD5g&QFkMTelNzU+#mkZqS%dXf)<+g2pVb!hs!4iWtvz zzs6kVYs_W7#$4uW%vnNXF6%ExqV|JJ0S99Zo4}Q*MoP&{K` zfj>OfcqOM{uT6o%inftp1ogV_I{1o`!(io88qfRr17Z>ihtc1dl{VJukkkp z7}XfXH-X=p6{mTYS7VN1jmuXTzoI>sPxC0xs9j|AYM%MmnE4;(FIDB)OZX#MjrmKj zfBGv^eqb-dYq+%9_b}gPR^dnVHX7)o0D}zQ+D~s{P+|MFoyJ_wYK)iFM(v7LOpW;)OpQ4s)i7Sq;wpXzzgR8L9?xGe2k!n4+tH;- zmT2`Wq7@H~UyRpHHRcb2zxAE0vTttzZC=Bv{rcjT1IP1sxV3Qe#CZMyxrQ^V?Z(%! z9Oia72)?AE75GYp#(b^l8=rxbC-!oqX0V?^P-ARkjoE}6vk5h36Ixs>kL_6}V2kNs zwwT6jF^$<^8neMPW&>%=2HEX*Ziw;ieP&nTpqH0pMc~@dHv%udI-FfrW0qHAmRDnz zS7Tm$>$qh(22F93#bPyw?8A$m^Gs@Yer+%jK-`PjoFnoW=$y^^s+B2qPMZ? zcy(3bwr@}Ild$vzjaf4qvt~4A&D3%6v)y`z*zQp0uy{hDHD;kTW}!7^p*3b9HD;N< z^u4+BvR)pI@~OwEyASN@>*Zsn_)44TZlV-fwx} zN7WZ#(%HQ{uR~-0D7=RMzHmHGLeQ882-L9ouA8gZFZ?wLSLSUi#jlV~z#m2a*r)%^ zX5)FTzzUykoEhIAy|;!-^X=n+{gz_4?-6Xwwefe=vnJuq{i`kH&#Nt*Vm}fp| z%(I^YP4EyXjd=)^#+Pl^yxyF1k zQDeR*sBvS4HV#lit-um~w+Q>bPoPVz&GG@&TAa}tI_XJ-_U9#!=xU4j)+W&$i@2Ri zw7?=3i|BESSSX@bfPw-2Sti02HjpJE`oMd7O~+N z_BheGZ7kKDe{XT+h!^9xB`tz^u?E4bd4KF_xX*ICouP4KIJY;h_S?-^j_`n$=lrNG zTx0j}H0DFNHT{APQ#vnp7BhXWk9ZN$3cO~#=2v{UyfT8uT%c*p_!{#!YZ}wuPbT}G z>g*BkDP7-YKr7II#x!uhpTFd1M;h-^T)H=&oAHJ~)4Z-|%zSFhWHe?nm-uU+lv`uQ z*O>7Yb{AXz5ZHYtbW`$&!0xl$;$!X>j9m!wr(hCvp9vOUjN^3d2kS`6Q5y-yLX-HF z^#!Bn5KqGGt@{MaEpfq%LZE9fp!G??*taIW5u5M!g9lxdpU)JGn-k)7&J%1VEFm7Z zsmIGL<}a4*2d}PBuHGbgB%aKXI352|Vn5iorL4{rjGJ`gL~+_aJx4TGUpS}OZ{MEv zgEyO94baRLpSsfVJB8n^@x#!kV&`v#f2tI)Km4D)c&Nn>|15pXKrogeTXes#eBR?+1Wng0Kk$n>A6_`Kqu5u?hu2&_(&^K`7(DwRGw^5Bi1T-qUq#QE-~8q|Ow)y)k5{t! zAv5bM>ho{HaFSuan~S;qd)5vH;*|w{nB0*!I6t$s8m^1{(DcI9ou55w03HbPL;o{N ztry2n;J8g3*TN5beK^G>%3km14JLgq?r8bp_b$#~{A~Z84LW`+lL<31LX?<^?OrHu zaX`7K6gBhn-7^>9h^WqO`Wy3^;1<(3?eEue?ocvzdl%e_aL+f z_b?thR?38H7f)IHBSw(@0P|G0TK(d!UA}z#U_FyITtE8cqt<$TyCV!3-xeC@X7E@G zhFctU1on&ry^+?qGf3Q3`3Gw7fqpBok~kkZi%xb29y60)?1zIAA!Ehe3GPC0slV3s zb_Iu{Rr}~=CI`(1D;|@9BF7FtyG}+9AvM>H$QOf)pvUpT&jjdkELT+`hl9JMfy-Zv z<4eHhhpd7Ba(EX7xuxH>(7Oy=Iyj}C!|V6O!w-;IaITLSvoW|SjI8t?zOC6@0j{LD zx6ouoa20SqgKNBP%$49$f2(u9`V|h%1eXQJH0)aQ8$_N8kO%4J1ROD&>Sv~bD=^oO zzlU5;Yu*b6uLf6AdK+wF%r)RDirXpQVy*>ePOaOk+|znks#>@a$POAv@>a;QQal^nTyO>%^fmK`6LE?ztn^?)Jwe8+E=1#VMUYUCxb#NEsD#aeyyW87)j`p^D1N(OOfGR`H51V02 zaK3v3*ObN?Yv4Kytb(qYA0cx4p&;Ja1-ETo^FBH!(K_Hq9KqQ?7tj3_rlV-yY;!*p z_;~<#e2lT)+;3YTGo{Co#yr9`DsQ;v=QVIG1l_}+ zS8UL)aIPIc3|brCyI|?rRj4x7e%~GD!V(A@g0L*ZW-@H`{UjQL)<95KO!|T5?7C<` zxTA43ZMzExNn&L&33>gd12e<1IQbYC%MV>q~xohWwp?$6W5|aIP;k z=CV&?-}||ou?xthFBQuj_YP}%?wjKD?e1N>nE!TOd+=YfZMtTEiW=XnV2xl&-%ty| zRxTMP!hc@rdXegj5ALrb{N%%gt_p{o4H8*DHzZvw+ zMuWv4tvi3s?-hv_RFbA`dEX*0jQiqKWH|Vq#lq?$Hx{X3I2~d9c=F@Rk0;`VKk9FI z!^n@vME@xPKfb&@8BSQs{GY|+{U1Nx&OUgE;PKX*;$L|H{!>2u5R~|9e6Q_#&n^CF zeSas?^*k z!;g790EhD3iVGP(Bj9+gSk!=jBO56`+*hi{F18Fd*l0*Es3nj_AU{5Vv_-g$#|y%f zaZlX2vY+`FXYlcQ_Y>R#&%mv33ilENarFGZ-o!EEcs28K+{W&Ju+wp)b9biM{OgY` zrX8DYZr(G%rYzP$rc>0}FR1oaYiIcblxa(~5gu*4&z7J(i&F(_q}Ez)gqDxVUbCz{;J`ptvt4`kCNzP~_NQ zCBul9P`-qAPuU9ZG?ql>0H+` zXqYF!G&anW;Is)g%v0cU4HeFtp;cA5k1O>Ze6PY+RcWiLpH-Kqu{f>)E69v-6>jT{ z4fr&u^m(%OW<|0EpRr`U(%4$hf|J&=k=ZcMfop6SY({*qVNi+RYnY|rY7N7ClKmt6 zj}>HAT8mY~e!L7aU*oze=c8e6@5g@%dI=$+YTLW7!Jkoq^Oeiuu+HX?Q+iKqiVYla z6>zS(k^bxhaVBv?mEhFQ$YSBf^h(Y2

zU!B+%jmrp{sU{PKrODi%G4aZVlU1Z zeG-ptKw}R;b_-JwqY3{|*cH;(%ogq{S??DuEogV^Jq)u^*J66t>Aj1!P@sKt2Od2I z2VuQ<2VPL_dYj?HUb^0-;L>oNa2dEPTn;V|*HyX#TJzT`W5M$O#0CGa4EhcA$CiQ-}U5VjM^f$bbo7v{?qVR28>L@AHL@fe5U`zc9$3*VoYqtzd%CL?lkymhyIIU zpP8Y*6VKt=xm8AR8UmO*`m5`^oDPKlbNHDU{W~H8jnaSUP{+5!zvsbj---THzH`sX z=%1E$8D-)(!B5-t-vd9x>0cD!j}~Z@i7$npC87V`w_GNecnm*tP5*=NQ_`Js4olz? zXO&eZPq+6y(e2ai?N8?Q8CIs_8PG!b6r3Ht7CJ6mRr~=#`U)426-h3y{GswQENZ|N z!BxeliuJ@8hptm`Ip+^-Kmnkn0&N7~s^U^tPB)!!-WX+GaM-{zECN?);HwR|yjI|H zmbwbY;k5B=1I`17aFOCG;x|+4ans_@K;{&$ZF_$qPzojQ_fo3OD|;Cu+)Q%`rbT8% z=0tkkLId`^m$v;q@Uqkx2{=|<>gwqx1LyTAbAk(yrG~JI!d2x*JlFoIYn-u8$ej2? zkv@?~a4gbXD{(}6y&P}>uH<y%e4BXW{a2q41GNpKwLtD*UM%B|h7~ z(*x#C`F-R(xKQ{AvI3WyUC%&9{5i;i_)99>+EF+bf9j^`#^uSbwOwVzF8OS_b2p0**NEPu{Av?MCrp`DI1hga7b%W96~R@{ z`|+<0r6XrJ3z-+c4-W-LA}f$pxD>AWop3fIBJ+@;_Q z-wyx10pf8k7w|bWiT7$DH^stt4iq}(b~%NA*7`4xE2fO3N;dA=D637zJW~= z$@TF*I9D{6Kqb7D%*9ij)tyI}t{}41nt0=wN`I#v%dB^EKf6Mz42L1hY=V_KGqV|@ zg>z|W-*xetFPJo#h|JK#@qo^*x4`l6R zRU(x*7=Ita%q+wm7Kx6%gm{!D@mX7ngg;U2s!}7_|5LXlI|?-wMl|wciSs0~Mq>1b zQgz&z;OC=hTo_~hx%mi3+$#wi9k&y?xlh48MD zrG~BLUOQVC`7e`6ERv-EjYhO8?b0`%K`j*SrpnT9-Fs*^z=|cN4t2HA3nP}8gvYq- z+7H19iDWO{zqj>28%dvW53S@~0h&>Ok|oAU0p5ZY63I&>yNeJfw#+fOD`1anN2Edz zb(*D(E=BH2WD*BS+V8-OCH9gs-izZqVlo})Nte2b{TZJD=#@0P8fqb&M~%?t7n|6k z5#hh#SfFi@aG4s(&7@kML&C9Twq4-fDLj&yo6oH5@sb-5i;y=GzwX%Q!4{j+6=JvF zv9A7yAx?!V$=}}SnBCZ;EHiFhm%BO4-QQ{V)W5sCww=)%NOYVxw0Q3+Jsm-8(XcOF zzvY__{M`7cYo5W#YIrXb87)<^K1@brI?j|Tc|;Pk+^Onca!uQO1FSf z7MERFu97In+!VNUFGo6&RoU`3m-P{8n-Mb%ZNm5LYGA9js~k{e=)z%q z^lHqdyj#cT;?PZ#$ZXZxh@|4?i;caduGd7~OJ$~e)+E=Ja)?v5%ve+lYwk*<6I$%~?`r{83I< zxR6FBeeL?s^=MWS$-y$jI+0GrGOcUK_#VYl+E}09w@}RSbeLI$Sfk&Rt3eqgKRZj2 z=1IakNUJu{Dq|#za=|MhD^<&UJ=@*#-_5SPn3=oyWH-IyRhK9rlRO50^TZ+=WTir8 z^kTfv$wY3DlqN_e+$*^Ha6j9KBM~E9LaTrO)OC&fVUflWTk4E znZY}5VjPYVguRH?@$w&B%Cndsd={dN%-gz%RHjB^0%kpCV>a4@L~>6w8SCwpCba8A zRM|$Zs}G`8NhF8D1mirq39OLmDBHS4|BpfQ(;9bRHfVvZt2Wt`F00Fw~Xl zZWNM4a@t`o|2bS(E0(!gYOa?pV3|NB+{@Skk093QZ{BugdXeLgpZhQ-n7x@&z1K*! zq}i~HlGsA7fX~4yiR4gRtlAJ|J6e5|DzD2GZ#gn&iKnD1e*q&TlCNLl#?=xuN!6+Z z*$%fxnF}kAQRi-)uEw#rKI}%8N#kW{wm_~Q?2s9K@mdt1dTE^k{|!bjp(D%=VHrTE~|+HkdwmG%*km|QEy`akVww>$SoeG zpy|t2<;ToE``^bfL#E>unQk7o3FEDL>9|i1N9LZPm7H8^E=3bXmf7VwSE4qKaxz0d z8|$_M?XyN$N=Z$AhP*vXg{+jB?)@yh9zSR7CcTm+m2|y!V8SCiOfxp zK+Eh2_W*hpNAh)&(NjmbHPAv7t;{INZJM3YvzSwBWWE&kT^hk>&g|mkv#^{gErotZ z8&+pDHZaXFOl?x*!`Qv4k>pz(BaHW6u-UPPS4H%GbJ zxgFUe(J@)pCi5i9=lyZJMyngJnW&N+j$0ryqc%b_EhDo6KiFjrc0ea0lc?f1Yt*?1 znX|;FGLgLmD0WOC4;0I;fHv zeWOf$e7?)iCU{GnIU6zDLUX31dLYO5%ZSnOu*~f@O1gVK5;~LK%#tjo|`(GSgo%xV-FwgdjAm^&Sf$k&&aP+rbwKYC*7T8k&Q)-#5U4cpQBb^ zC2jCEZz)?kR0<(%yqj zMUBKy(KXprH^V52zc$Lef@e#Fa8k#?-gE|R|wVCGH6`3EKqmf%(xAu+YkFZw6;w&A!jlKRBS zPLWxW^-U9bTu_jJ()SeVTSqq1e+x&VvFMn8N#Y_IKMQ{d7r|BFssX;zpE|{i$ec)@ z%di1Q4cO~>S@{p)<};U;*L9DJgv_YGyz+ZxEyITJNN^Q0^*Q#g;HaO4%)^C(y^RRC z@;SB(Jy8Xb`eM4tz>&*|EI^jT?{#Yud<}5lO2(AK0h19dhPIYB~PWK&pD;$X|WFD>r7sI8@49j#s^yM6W6` zNHt3dA+zGoLx$pCl@ZTH(1}IQwA4$NhCd@Xr}zT=C56i^GhF+}nna0w0;W|NRem4t zWfoz1xKQat;;$&q>(?d5e^nGx{b%5o)+LyOEWnkBg^NX+wtA+#p|o%r6_$fPgp1%R zaHbv22bY2K@p6Fz1^7$Ea8s9$gw-1}@(a76M0bmDSMxW?(&HTKQ=p z1DqGG4ZadIL<$VmJ?Lta*duMP_8iTgk=)2sIl%K+yZIIml1;3I`A z;;$;s$4dt(mqVhkKb?yPkng__GRooxE@%WMviMR!=`JH0#ujdLwDY zW#P}mg^Kffl+h3H@hbS#x~Mg{TKj85+Mk0`0ZwzJ2CT!%2#euTL;J?jIvIrJTzKF1 z_euo>mb?Lxu}IUgYQyOt;JwWZ!t+Wegde|bt{aP0pjofZ(?F--tjN%ZdkG!tRe@9M zqxZx4g#V*t`)8GM9{y0_vhv69n+?8iI4xX8h2@l=87Kgk$Tje__KzC^e6G!~dV-zG z@53px!sj8wMjgSi$kc|;UZ<0R$q7*q89`RyOj;Bnvv7IAOt9qrUVn$!KXHL33ozf z#h>34*Z)vJB$9?I%1>Nvz@3}H2%Juo{`@MqP`IcetYWdWe^mlgBPEw2bply%`3An! zfVF-ZVbvc9PmPjv0(i1;dALwWYee~Dd5$O}nDO^zg68&&7oY@@l;WBWH z7v#i4P=G&DxT5?%kt(><7A~^qIu*{spI6xHgu+FA!|L;Yi~zG`-EbQI3|vmQP-FyI zfvdu$#y|&-iR4831PcmB@K*#^A=6v=bky}fQzKza`Dw5qxI_t8g-dlhBb_3%kOlFV zAS>ec8S=8K_*C#CF(NV#8H(RVfIn8)Y>nK*d1D#nCzlgkXy8i?xGXq`;W695C|m~4 z8_p?zLHv=(7&5i3WE?UN7s5rt(MDDLsqN}E$#(*0>zr%rwC=}pIt5QViYmwluK*#Ll45lG7a5=$R&-)7qE2;2``0e%I`~>X}N9CMI`U}eM z4S88YSPYlic@?EX+|C9*C%7Q8p2{F$IG+e*PT_+1OO$~M zh?U=T)eUqie-8cvT*-5gvG*e(CT7OsIuDnH)0xNvhj5Yb70959uhck1fTMC&q>lKX z{CVh?d>oOn$IQ%bXbL#m$cW5|EbJ!xKMX7hS@sfKto)|CUYfM>=aj#o{3Y>ML{?Q; zYP`24K;A#V(+Ouw(@j3-(A@gt{Ty6ay0aW0qNLPiwb1!rvxIA15u1qK4jWR}9YH!4W zV^~&X9x|j~FvDW;o1aPhXMXm>hJ8Z0|DaPqSc&0qW}mvPwD>cSImOdv!D4CuNCGP& ztB~n^>xO(LvceTs5mxdXWGsHOU)@Gp`Mtf`&jo4(a+ZN&u0gp3T!E{?rL%RT8S&>7 zXGV~D|@hYJ;n452xd270w@` z=KoLyMDSMxS0Ph}N(n@2gY@Tw4@E`|dKKWRaH-#5l7e$KRQqRz3`IsYC0C^t!R9a@ z89UtYXWYB;*D;f&xM zWY`d969yNmBf$MYquaZDj{g6xj@rT1Z|3g?-h2`N7;Uc&g4)yPhrXe%pX9jZc z7vM_5Ra972`B#F`C0(3V%{$@7HLjJ3E*fTE7E5w4;%?sfvh%!d%e_YumRU+{AWSrNy2al z8NpTH%;`S2^|>J}Tt;M0WT8PfYQQnD!9}kVE(ce;|6`&B5GA+@oX;txDIfw|7LGVC z((8o8!o@1goYB{g*H44bxUl;8&w(gNgb1=CenzUopE|Q{tW*41k$I7!*MW@T%voq_ zxGY>At^`+xiz!*Kv!$fzvyme>pToTJlZzCtz+Z(+o#XT~B7NK(Z~?9)d_`ncWcpmB z1($;h1AO_2|51uw3~45!RB#zM#>t5+h$L51{<8RE&9U_7q5aeNVuXyy9ApR=3HF() z2(Ch=&!1s3a6T-j{GRhNYzzag3YWeB>;KFJ$`Jeog}o8V2z&*u3YWUD9>?o+g3H3? zB`owhkg@l}j@PF&lYIM6at5;^y;5G`5dKJT1+og4nq1FFr}8s?7C7I)l{^+12jVdo zp<3axaJ9t6A1aPv5pWD=E_S+Ukv^VHd=(t|yznJTxIW{b3h@s_OojD~QLhs?3zvrr z8Ab=bDzfvEx_(yq^YDjok>l#)pONV*O1Ucj)TMP}Uau2e7A_ALG90c-2^*=)zOV1& zY1w%h+CK~ByowMie*}L;VI8^AUxi-!a*S&@h80A5y$HC{z*PefsVVYBPuhIIxFL>4#?7Ybj2tcu?!)F@Ne z_BEPmz|_w*aG_v3{v&`G&RkbFloo#mGAI5}WCU4(GbOYuTm~)&SAdJ)VmKz6nqIfp zsr=cxzwh`jAfN{Sry3$sT*JjuF+7o zfy+1GumSt{5%?G`FgKzN;j(afIIln%HsA=j0#{XhdiD&Hfunv-WI<$!QvBX-44k^D zmX2%xOr3Cs1eYiq!r}((4L3@2vrD8CGAsVPNUs~-+|d3J6e@64QB2)}YKQX?yvz!h zUqzVL30D=SxR`#nznOz3fXl-9$a&@W-2WdL`go8roVnH6OhabHA3{dr4=UoRicHN# ziQ#-=S>-2}Z@{782r?GGxeWz^%fK;CPNcU<89FY&i7Ke_RVYxY3O*es}i1z0s zydbhf*$^jgz^U8O{++j@YTycR+MxHBR>gyhSH&aK<_=^U&c~A&PNQD zpIjuk(!evUs<_lWbsHJy$NrNdL--@O3S3q3sUBnm&S!u!*MJLxqXxbLToo=guWlm; ze>jihUy-T#NC++qrxWx30{93nmT>cTv^AU$r_2b>i7Y^tybfd)E_E-`fGY&}D#2L; zkTINDfIv8Mp~y&NMWj!#+JMQY?n5Eq=+8pt#c%B?KXFi2L=3;V-$hJAX2hQp$p{7U zmnanhxs z(An!0nH5<(F0cTiM6wou>pT2rp+pp!6`2?56ZJAA-w+l9n?=qJ_0q~;yZ&c1Db?eR z=2Tb#{s^uDR~0_B*cs12=HWuPNI2T4h`%Z_wWOYzpc5b`L;*c|P!bc6^72s+E$9R42|5J~nI^h_Q6-j>{{!n3`;Qx(`l%2}s(*EWNmuOmK zqu~tr99#$&!Byb2PF3OblP)X+nG=6OWJzQ_uD}12fEdy|x34z3`$LVY#soXTnt@ixJ3- z_{rzQUl3WM6n|A@Eo0D6y@0~O<>2Z(+P?sz1XqDeEk&Ed<>9ClLPl^goOuz~dbliH z-9UYg@LV3@A$8zl(KX9loU};lX6X0rPa-FQ1(7AM>?L%3BC&9(m+G16gg*;cfGd%w zQ*pdMR(!4feV}<6)dc5p7XCb32p0)o5lJ2MN?q5-p-c;(5t(byD>#gQmh%CSF`RkT z8O%WD#7~0-_)7}w#LB|QBF$^x&s3-4vhe5O!qZj6u*!xb%+3hF0SrgDb0fCG!5QIOP)U|? zjtY-Bc>!l1M3#9KX2|?$lr{QMqA+VG5zE0Oz%8iVc};f`gv zd<5u~CV{_w1U>rTi;AZ{jQ_^j_i0xa9!eCxgOKE<`1c!{n8mVKW-(5<;lbE@fT@rf z@TbT6*@GNLGy7Fi9cQoXXaCOjz){e|=T%e*i&Gel0=`SbM?c!n*7TmJlCots`fgx9 zdqj2xRQ&G5;--)EY`8`E9<{&yuAe=~{8VPcGPh-1#!h24$aGZiEuQ!Y>-2q~ggQjA zL?Ze5QLb!jBSM)>$0btjKS93vxd3HlD_swbs*N*avHMrv5KQ<1txWjFRp|-HV?<{3 zmiIclCylm7Ot97$uFoua&Y3+LM{2MSJxH_GNc*m?Hduw>3YvXxJI9RXG5KT$U9rA9 zs%jZp>c>2ugY1ACHgL9%vsG=Q&X$T`)r22T#DBXd2T8ks%XSAfAbH3J?u?wxz*H>r z77k)zPv0IbQnk!IL)?isdxHr-LabpA$T3PMO3_xl>rU)A9(j5O-LOop~RF~K?gK_i-^H@ds z3sssKu!&1+O{7(_%wuc1qf#~kQzjE6*TaEa>};DLt=KAclv`}-t3j#oPa0Z`KO<*; zR??7V&col4llhj0EOY0UO}3|hhU8<*{NXFt`kT_uC$KZ%8R`2&?9e5(eNr7C*;OXh zaoDzQ*zE%Q{QLr)pK0xZUR1Rjzb)?kIR5{(^e?C+NXPw(F{}~ObqaV8>%Y1)DOplhMzO`aVRQ# z|5WHkWQM-Bmm5@<$sDVWc#Nsg(G&Hv|JHPvOdcET?MgC}W&45}OaIOAI^8p(giF+zXshmu-G zAI4a<%p3FEk%`xhzyYG+SB$pKC$55iOhcBr2&X8rS{HIClhH>nR!MZIqZgrwqr^6F zBa}^A`kH2k{aj{mG+>#`pv@k3|H*Ks8<9A`)GDShC#?w+E0BKS-;9d?ow4ap=lHYC zSm{$qm@ktV@T^QO6WEtyQi=MRj9rCqXy?mg-0@wnp;}9pc~q+CGep|FY^mF?bB7`= zM)EP4LB~&VljK;Y5Q=2Tw%9)d`22vagI} zp}vF4=nZyt|NgLt^wA}9uH>bHzkA75=lU3cF=KQbj4K}hRN^hsxb1CM2X~-)!@_yU z@D!ZK#QrxJ<&Ve=diPzV&m)kIbIsRPv5HSuT#oNxjxBS^JC3;pOn3&Ob}T^YIRsPv z@P$wJ*e09<Hq!k$muLH&;D|48)fC8?JBcgEOF0IFmX%2N;W31)0TADp@KkM=!Rc zIm?#W1@rsr&|zna$#k67f`6d{vp~u^4Ob4<-#j!$cosC)Q>Q?JH|Do8O^#vLDpMu- zw@cB)tbg>(uGms%;404=>V=)c*;G0a*F{#)a7<7o%RC_6b^vl*w#?^y8k;|^a$+(a z^`jsW6`#>}xym{MDTU`iV{{SaW=cUQMaath*&+A>sqxt;bcIophl61uQjsQ<)-N- zt_R3;)X#ndjZXrt!hcuc`X{z=j@ZV<`8DDc&ZCvxP%|uL1vOK$%4C zN63Ip++1)Qig_{3cA1y{*i~n z6E`U(OXyP*NhEJ?b)#kx;>4EGMPwNJb3t%j+R zpTiJ`h31`El^Tiqxrtrjr6km;h!Kh8Lo&#FSVYSNi{&i7r_gp)OC60%6?+mpe|QV2A8?S_J>krsnev62BNSPG9BmR(#s5ugyZL@GBsX5^rBgVx}h zbr&#YGDDxmVTH`j%u)El=Tb~*#5l*hN`(Ra~wgbZJA8RQCR7-D%O(g z$aON|-o;7BYD5@CoR?l{!WYN?EUX+z9K<yDCg26S~uH+)i9*s`R#Ikl)sLK*T!|0E8ed* z!xuiAFLN6ZGdM!1k!(eK((ZBS6&1@&*|I6H)DAFQCAHqncU`|d%o@Q|Cw(bmUn-So zr;H+S?2TgAw#+z8MXZu1(7R$X-}{e>U!dnOZT<^hI2{^;etM3bfCICi)L2A1`EJtP z7@mL}RmgOVLSJBVQ>0toEH`mWQLw@c#wlZ|#^fh)^pP2GfJ`)7bD}9*rTsAc*pLg^ z)MQ3~%eyT0zX@XbCRs54QSeJR)t)JTh`f}pXG(KEbz|1TH;{stqWM)Kmr+zwBHCAZ9>SGvo73gxO=rVYo8 zb8xj{vJ7W2)+c+os-KFgkH~a%N>vY%9(MSFt|L4KyD>F(8iBtqVYz;e98#LkCl}v% zxo30`-9VFnn&pPTaVTVk%%Dkox+2YyB2}&4Qp~{##J&iI!y6g%S96-}LiBww5t%`2 zPI8+#yzhS-eYIls-oMjmZhp`U?B{k_G;zDD$`}JKl3uY9dqsE?sN`s=ti#YRqkvS$#Y5Z#_Kr*v z@8Ry2Eq5*K#5U3j{CO&wKd}eiOfwrE*J=k}H(H@&nYEX@BK{amnM}tR8A)Y~B!1R9 z(#>BlHz9vkqj>(SJ?jUhTcEw(*|H)YD1Gq(xivkCd9P3<`3w9RIeYX^*gY(B8zv!M zbhuX;&VkN=JEX`R_KHg?xd1nRY&MKL{7DX(Gq5-s4CZm0%1yvOk z?xa!{IUWQh-e8o-B-XjiWd{GlP_`=X$kg);i)opDQWbW6d>0}Ox(v<7=KM+;t3)>W zqmSLhgQ1H*)dACSxvZ?mjzIabKVtUmalLd?s8nsF7qG^nsohaM;oUT|Nk2EIj)P7_ zrbGR+1vIgdje_yc{WHuOv5hkwb36ylv8ay1J&bcQrT`9_9a&3Uklc*Fl&Aj&Bot9) zz#-CcdUz46kQ#MA3dZ5EyYwaXzZJA%>i=ue74{&)&_|AMwzYoqCN|utzqKe+VZGrf z4aQ|)o{)~ULWcaI?0Z$}44Nnd<~Gc6+(ioKflWSzys*hj%&=uL=u51t73dZf%bbSx zTmuYm>#CO7Zd*6fZba>c^I@msnf(!q7sOV{LGDI(VZDMqk}ApFY{p_mR7tK671})=H5ODzb(|&t zC~<;JghQ~IKr2ZuILp*%m%3OfCD;F$5m6&~fvk1cLxWZ<^II&rI35=cM=!KiUc}Xv zqpu>lO9l_Rig=E_=Ruem^c+?T?A|*=As%lvq?g0jvZW$Sp(ga8HjObAT11hq?qksn!iUAc2AckYsW8STzM70Up zf}o9pM4=_f2nbD%LW`(K&_+d2KwA_=1gbb5LTH}8zD5IA0C1`>&Sx2xF8Ed$3O_ROujP`b%w^m8s|Mr!~Wj;N#sxxmar zd+=lh={ifLoQ?sJ7h4W*!P_yC0t7F^AP{~ThLR1*=MbC~ByhI{uI3@n)QPH)LlNO5 zkg5EPWgq(%0Ew@qoH=F! zzlZ%z39@&WT-4=*PO6_m6=2K3{&eE&g&+%J*5iL1ziM| zcvB!bK|X>6D&)J!ocMbBikc3zMj59BdFu~t)7F9~LnJcA+Syx~%Q<1{v<`*AGUkV{ zcm`aBli`mB5dLIXmm(S-3$0__S_AnRL1LJ7V1C>|VVT7B-^?lYlOK?`69!^*Sp}JC zA`L5d(WW6`Ik2R<7G+nnbUF1mu7VV25yFUXprmaBw2q$-Nhv|*Vp#*@`!}Xakf`;x zF(&uDoIpRokh1S{KP}LQjKE3O@w>q4;sB^Aqv#TuCRg~{Jgsag2+s=g%)MIZTTz&? zjo=AhFqtF}UI5W7ivy@qURt0h%w(@dLb8GcFOZCVL~m`8NzCRINLo@5ANtK$OaGck zBw>X*g^gTRn7UQgC{|_j^f3jk!K45i)GhodnG|T@0%e-Z0ubZ@>tL`uktGsoVM=)k zl_B;CpoXu(PB2p%nT4J7td{U#zVn7Faups9>mX_@^n*H{AsWuT3;m!;=i-DMp@QJm zm7B;j91|RDeY>MrQbY=RO;tTu3NgZx(7sWq00t%}$Sb&sg^?Nxx$#da<^xnjsz3}# zib!+~N|Q~Qe~Z?;&_i#i-ZVyC&61^H`F^!RxF|8UnNn`S@($+qEr?7~kXadx%xqYS zv>?CQ2hVGm{Y2`;y6P09%z41~oo2XB5X0qf0Z(BgOh_FAH%v%L2BnCGN1=UStY3mo zWCXeAJM9@&g0|%ZdD!|9n7#AjTj48u6dGx23BF{=dRak=q4wvIlL8q zfjZ5Ym6)C-iG~L+*5QiCA`&gFq*?eES|&VMM39lbm{BB$A09PFRqQG>S@A5zyxL9s zsqECGh(s>1S~ZWgDnlsRak3WuwIUZ81j%90RJz!9iut9z4$m)vawLgFUqvReer0m7nGc}La&ZOPZ25YZe6MY%nv*t?ACGG zrKSWOQID8ky%A7OWVC_lKnvlAb|J#?FCnDvQY?*O`Hf}~;Td4-HNHm4kRd!5of<0S zBpN$G*1{w(0q-!?Uy&zx_h(X&CRPT=ApU7VZp61ys${q^>`zvp7ckE+s)o#p?VzAZ zND{lOqAP;rVSLI)?Icvuv>&rk{Ys?gc}^ZgicgbUyAm5Bn24{^nfBCw$8F#}&>_;NOn?{pFqSIlR z814kigsNNAQZ$66$OuRIJ);t_;5DOO>?g>G`1w{FuB7Qr5({4sYfPQt=lrxFzrCxu za3^Au6=WX}R)^uJR@b3Z8^Xr=KElWP~Hy!ne<1#WX{EGsf*pnh{|jziAa z&y?C9HHr1Ru@8kw68h7frq#x4g~fM1c_u(98GC+j$kIpjydPDaH?!P-$E39l={S&x zA7n5Eu*;0vY(zdqq+uTVJZuafGF|bfzM~cNaTFqZiCOVjb)@#f=0jBM7kDgu8K#iq zd~~^mFG)0fnRQr>Mq1N?oVloyq>Oi%X9f9ozV`8EF;5S{SG4?Y(@>=<_mZgCR9ZB=VGLQaduGg=shjL+q7tX>eAM zTdWapgb2qDQ_urwZ<((Zu|6^>$kEUf7T`v9)YAe5Z!gUfDV#f2t^Li&NLu^YZ$P8J z?a^gA5!0tTtkbsy`IsU{_y-_VZq6lSh(sz|i?Wg}N=}$gnXEB*nL~{D@ANmZmNs6^ zDM^q@C`vX?4}vEn$PVkeE{C4wh!lEds*79~&sfI)psa?d7BnF};WH&j4~%6Qt9vO+ zkbj64!)#uLoXQC_2*#Z`l}G)G4McLQU9OE1nlgE&%~gxA6#1PdNALpEEP?P4YY!iT zk%&D>JESmLNOh z&q7Y*X;Z`L(y<{_xV;+|gD{JiS*6bq4iBoQsXYzyb3~$7pc_DGf3dWE3cJGrul0E79J zW~Rj%$k-qsdiD~w@=Z{cqESWd<1#=;cjUMt?GfW(K8rvbh=kOwQ| zux1X(N#kr3@uU^e<;ZK+4dk^vO)F}2pSGZL^c6W|#a5NY=Et7{7X8TPlh&%o&~Vg4 zhP4L9J57$dPky39(pL%NnPy$S9}!_PgqLAqKiv=+FaA7{Z*S7z??X5#L2e(f%5VpA zI71}bcy&Xa-uFZ!F}=2r_SkmfFz>Do3Q?uUMnb2)2ZnVH8sb-}Nb` z0>vl-En-kTkqH?=>iSq)MPKbGN1!X#>pbKvWJP>91#K{6Qytlx5~Ph8v4zn6j3BYj z`ibr>AUPtXS7HnqhGbkgEYHsUYM;)Af#CBfOix9`Hq?Ug8^M6~n8Dvhv4UJZZ&Rz6ndn=SSo) zW6=|lAVaueZ4KpEwN+Z+vi3-gs6 z;iHB%RP}97y%VTIo-$zo?B!m0aZy>V({^Hr%}Db*UUD=gcj>S3x!*MA5j2Y|cn&l& z!tu$(L?o{ao5sd4oT6RYgZVobvG1e#+Qz-N&^iQqk6{49;($C3-`cb|r{G^FQdQlrW ze0_%vb5^*jcT3&xvfPJh zhnygVi!{b(fhYbt<#vk7IMC;(8+k51sOCmiZwSkK82>Om^PDmJQ8Kj zfC{-}@ePWNV93hOP&4y00A`mmWDb!Wg%{!TE-g*ZVzkJ`=m%yAhu@f~twM+?A4lX$ zEC8U_Jg8cfMMzIc6o=Eic+qJWPr3H5))RILt9BP>pKPOo&mF4T>>E~N~YGPOM zIu4&|)_-lQP?VBk0uxs1LA z`O1R)l-folI?a@8veS{+lptTeSJ9V@qLyU@dU>rH<#7lq zCrGNbc9k0-sQ5$*x~ioP9;yLJ39=3)%|whsU>PC>Lk?-Ny#X=8QZ!35|72urd=gkn zw>jm+Vhed1n+82*mEw5lA?M|0ATAktiQH+!v<|FEIYMn$p)*STaD9;lsD~_`hfK(4 zmQ$N85Fc}4Eb=*sYI^cOZf`snt2bz)`Ar}@8A9tFXsMBHmj@WnK3j;emenXe1uWrB zC=(_bU$?xJAm3UE@XJ<)NJ0K^9j{@LQBGK{+o^J=!Bc!HSfWizPy-m>a54Vid1JRG zn&YsvupIkMB3ijDdP0tG;c+`PeaAB&-y(7j^o4fvZTLtLDVdt+S-I>u|BqEFx(9+6 z&emv*nD(2f6VvFov*jLEFMBCL+NQJ@o5xHSeg(CArRjCn=MAJjd*4Rs(+07x*Wc8g3Lgdl^MU1^W-UbE6umLgLYQgPO%J|YVW_` zn<#7c95x*E5gyn`Cu(j$I5|POzpsX!zcw#f*t8}hS5)QK_ zD`wr!oW1w9u3ZhtNYh8SC%(y0p}SKXiTL5qhpJUvMzOQVbU&g`rfy(L5{cYp9gmq* z(KMlG^(tEa)f$5nPgzwpHUEH^oNzR>`gEBYjrmYUihURPl$_0gdbYy!Bekn7N7*dvHuC#FJ4ME zYPWto%_@gCuGPKo{p7Kc zV0~HsDMH~x=-bwYhrKK+K~A$S7dO=Bh(sSTwP|4`alwmPef|64DY=MZiZQle)^JN) zT99UYG_!7{eG#OcH48T)#<9ip^{n+Z>m&D)f{a1GpaSGzg{YSnq!xy$l*~mfSwUu^ z7eJm-oS2R+p`fNHXEHT{x1=DSmZ=#X37#~O!XD@wF~giLWQDI48f6v_7ca$@Qr7NA zG~zeY<_Yq^O11PEL?KNidMA={R46gLT3MZoa>8>d7G$ydeTFVhd>Q3b!Wv?hSOT>@ zCCEtREW>J!+|Lkcd)IQ!$rVfwp2ZatKUYIto#nJk znrL_hKFl)Rw=k0hX#$HvpVgQ*E69_ZucH_4gGmyJ4qvJxZJS34eGL6)1f-E7haWx( zMa-yv15Y^-b5Un)+lC^G<0~n+IjjPC9z-Nlg49KypU7(X$_Uc>kS6c~${`XNZQ4Is z`Z%j7C}-y7BZy8B@gpZ%<-eGknh~xVX&nI;P?R9^XDjkEkoao&i^l9Uh6BhYKBF*u z#$5XX9BFcd>)LSUX2{J7@`?>QxLz=}hCEGtOc5|cI7&$i0*Y0DCbw&;c~4I|y!s(MSS zTbr2k?~~=24yv?g=79~*U8vV#{I3CyG&u@RvPSJNq!I`>z?g_p2_fCFbwDDUtyWiO z7AFaXm(S5InBS7g6zGhdstA*TWQj!oVM#d40>34!98(y*^%OJP%JWqqDM4you3h;A zq-2Oh@13Ema*wi-T5D44(m41TifM^5;Is%$Q&NzhDp!_741>C-1(}UzgX(?^)ICci zTIGP+-=R&J+E6HqxfJH+CE$pEK)ILPtPy?}a#Mnw483LLtpJ`35KO860X1cQfw!ur62o zCANt&|ADe<#95eb5SkQd)=#QZ!>M*eqSsDMOs$CyP>yc}qiiN;IpXyxW$Z=KaXwxQ znjpu*EHj)_AT%S$78^Lv29gtGe6hxr{k8aJ%2{Q4atczM5@e;B>OPdSnR*hr#!Th; z)Qg;O-D!i*rr?Tip``oKM`QTU14#*zG&Su3Ul~F2G3iF0w-J6$kTnw(S;ZXRN;%QV zT5xC5=5J;A;ZLj+eh}U=WQw*%(kejE&6er6A#gSem6*xf=%=sg$ko&cA`Pn{59#MY z^D_wvrJpr4f|zX0h`&?JO7vt>w~3x?nW=T)Hm3D6h$?t&u4*!t=cNclZZk{QQW_IN z;W^)HYgP%qa)M07LN`u+)S;Zu$#Wrw0qg+Ygc^||((n!NQ2o!aNcu%X)DRCMfLLb5 zV_QqzrK|y2ih2?=oRa;lmV#`4Q!}y-8v;Sz!;&SY_t ziBryYrayYvM7Jsij^{d<;|lm+6P_~S=}hPzYsraBt02!}`w4kaPFOew!KJe?RH2o` z46r<5Q>yOBGCutmYZYF^3Q8a0Vb|w{d}hWY6f00Egs>SJPj&ecOoiVe7}ll1mOm+? z;ir*n489kmD9E-CHPR8v66EONs<3T=#J{4iw<@b4KZmL($f{G3Wz3H6kR2I;s-snA zmUTha=LGrM^5;~PVtmKI#68E9)%0JxSQmLtL+0uGmPhZgTkth` zJ{_q;zDYomg1m-J8Vr9Z3z10l6@V7%3CvkX5|d$jOW#g%CtvB1n+jN?qT>&lvGtkW<3nBzh@&77-w0s2g}rM)|Vn3RqCP$?U+t2cqmZ_$p6YVAUQp!yj6hQs`Pz|bsKrJ!v z#WeM0?g>)OI&<7o7W>0l;pbavHuzM>gQv5?kR?1B!z5+}hCp6Mkm^=W9U(X;NN;n@M*D$* z`~$13nNy8X2hxK475c%5)Pz1{iA3+7mFQ8A(+>OSqi;k5y$0=0ib%mg+kUkSsS}n} zHv5CAbR3vQPZ8_>R|69NkwO<@-kmjetfl2G*c84uLAj>M5k9uIMx-ty0tBbu46ufI z8r3ZJ6S=Bm;~C9in))Ef=ri;~B<7v5MvOcsL0y?7eyq$AiQctRr-)v#&?|YGs5_9T z_y`c@93bP&FG;ELp;DTlU`sPgy~J!O}ApbQ(n;J3yY^Hj{TXc#=e- zk6Ui-pj13JT7LEdM@Ia-f$U>Qk0MDq@zeBEd=p9Rt6z4EpZu9(kFuUdWqdYC3o;KC zo$7oIE4m=d^R?4hnW}n_LDximWAs|n*x(d9%(hMuCMx+NwbR~D@hizSvH zhp*A8*dU0SY-1#JEpc=jk>1w0K0q}PvqTC;S|9rmQt{Lv4l5t2qH*Nxei9Ju26Uep(VvAU$elKeaypQ#Ad65N zSf@HOJDz52euLsN^b^c(oNl9uA&5Yuh@DFQuel4^jM=0`=mFV$o z-sAn~uLc?xrW{>btob5xMRm3I`IIEc8Y{sjNNG-xerq*`Um?!%XW%P(*@+t1PZq;w z6>)3|BlHZ!q{$NAwOGGF&83zKa&mn)slilZFYJCkhCCI!D3ec&jQ3Z zOQi5!OtG_je=%0dN-|p?@H(ETOvhU#>L`6;_^N>tSv|jt!;Q z=w+(MJ>VrJ$oE&Msc*wV6{KxHRc&;1uow)!q6e%@3#?4fMsI*U#req8q(6*;hb>Z1 z9hgc%7GtXv(|rdElt|sH{;oX7T7murv1N*WM(l<&oC;Q{j%qBi4^2a_jV03iEEG8GWsBn`M1CGAJN-+v~-sWvi)iG}9c=Wp|gzLhSBN*3&t!+c+)JqFecwfHM zn1`5?g0$?Qnp7F-iM^O;->j^bzr;G8ST>q^k%HD*C*oG-9g)H$5cV^H$kahj_?E*q z)Btb=3OxQ2`Et;0)?(^5>p+TV!4R7WSpjhb!s}7Ls417SD13p=Zmi0KkK9-_2Bzp7 z`#wFxn*0gqwb0W8tp4N(Z|SSX_3g$;o**mnQJ6dlBslgmd4^i1EMYbgi8jT!gl1%e zbrk$t`e>s@JDw3wl`-a`nDIbzf|Q{*#t)stpc?U!6g<6#@|;hVBU1R89A3GWXiNhEqBw2wJb=~w*0le5Y9$w+-h{H*MxsZTPUg8XJPvh@&Dd<>)%7DJ7g z7dZV~)q|*CuOsRMqj{lKpr5VjS|fcd@`Qi4f?dFZeU(T@TlaQ3;y9K_-KkpR-!y$W z+*);^GaBQJc$o+xthyhwScya*M+1_$xTNgZ=E>La9_eBhp*6E7O(3^#%S5qokN_V4$r7`%Uxp0K;%PL0?)A3za6j$dV zs;@Khn&64gDe(Ir>F791Te1e$(a|EcA>(&su3TWohKZ z-#BI{o5stL_V{>stovPw28LZy^893<-XBB$ks*4$3*|`(;z7TeJue-P;Y3ED-LQXz+A+5T>1SqQ3}ZI|f(rKG(=K&xEaVUf zPlDYbFdSiJ1lhJ!XHZU|7$S8CS^dKhQ=Yk)(`N=RKy{qRu6gODx9LPcYtx!0mc}bB zjRP%3Zy}T{yhOscqRS|XhXRjH0ur4#OxvkXD`+Smf3Bfii^!+QQMefcJo-UgbzYlj z`05MLA7!^I!UzjAyPYyNgz)%eFhwR?+0|#+r3jV&itq~HZKTE7OMKt5te&5vWAsEj zPW*Ut{5yI9WFCM7B&RUg1DFwH#$jo+mlk9^<}VpN%wKw0K@u285ZOpGF_m&VAS-Ed zhMC+8$}`SOk;4xcS>9cRbY}=POq!KE1Ci&m(S+OrA#B!SZ&CCF>l^e@rqImY+D0s8 z{s~7nH0$h8oMNRi!Yu7aEERHum)61zAS=Qh4c1wRuXt%#QT6v@)0e*1Uu=Px#HLedGc0qbMaOCrd3vr^p+A&jC1{E)ktS9F z7fS^s6pmUy>wc7BPLL@!dvgWbt`vCc^|yX!L(7HP)|I)11)nBMv?f%Zw(A*--bH3O zS0H*hpDf`#o6ot7a^I$>JJ)M_@{O6a8oN|mr?B|R5&7CwtQteg5(@wRm8$SHkQ|#q zBxOo{9gw6TBQZFqj!XuUo*~We$JV-VjYd|Op7680@6dvp2_z@TS1^QB;;(?jXHl;Iu6>f43Bf5s(R4R$a&9!8 zea|{*59A?w;%Tc{mFmc@*lddVql*UqAp|D{8H!evK^+C2v>+Ft&}pw4F`0tgTN~qC zYAC0IV((DU0(7&ekb}UK6r>pSmfqylIzjf@DJ-3+$AT;a4>NTu^J@+hF#x?BBKf9q zP0rQ8i=pT#;h2LiAI4c2Fi<$25>zM#J*zRqlBM7)C>PVv3sTDfM8=wuPNI?~358pt z-Df~h6f9IDvLE_IIUgV|vf}MjtI!uwRbuawsTm9mMK`#F1xl!(%H^74pFj|S=wo#g zub#p$r{d!y7#FJXQ}7U-VKK5TWUqSc{}=;|>^XBOiROit)wboLo^5rWRpOF>iX$ghG_0^wG$0c3fav6~Mh zdSG7Su2T{FG~dF@P4nJI{%6I#oz?Cp7HX4Onj>5)AAgU2YS;wyNVXfKKowFs0WNhsVJ=7^c!o4P5;9Q07AWY|@J zm1hjZ7-6siu4MujQc6Xb<=Q~D14#)o?^7LFO++FyM52`!!oV`OCt0`f zL!^>4=$Vc{ZYbYX-6J#+I zjHNysr5;~KIX@4r&_JNGk*_I%mRX5Kfn=5?ZfjFkTqU*~%+Ya)p>5EENb#lMZ&THJ zYy}sA$b;5ClrV)kLgAWNg2wPlnVTz!WHA#(O>E703-Xk8{TguGAV_T#B<%^7Gh%%i zeT}r#4nvgU{z^h)m#V26&v*-R$qFspFbX$Ar0_npA+!Z1r^=R#QxU-1)(@4W$C%xe&TV zFrKoo~vP=Py zoB@&%q^B9++CXwd3huMM5OZ)XY;M7}(L z1!yds^-y)JIHROGmhQKqRVgCT9}z`LI>AzLt5t{Z5LQpyh@OP%DW5AOV zr0u7=T@9uVE6&JM%WU(5Oem3PF{UjzF?Y9_ju7&g#a*!kJ-B3so|dgtMXJe`P>@d6 z(;9U=(n+M?eru?4d`RpAdU_G%K>cXSWD+T?j@Zy#-;QL;L?+S5$5xw)SevqhqTi}? zKlHJ+1{+3bXZ8`uif;f*-BT~q)bBJ?GRz9_H^h((;q9IEQ1gw9A(7HnpXe~5y5(}s z$*R|XwS@P7QQub}`;s5Rhac`UTPx_p2sceAd^%SP6Z+l=Ht5dGLj@HE_y zULRHYQVZy4E4yO6a{!zoS9mcxugvGgEE`2^mcKblGzSEqSdTXKzJi$(|A_wTT1KA& zBqhjPWEUk>qB;wbxm05?3rJ3o?+{BGsPAEp;vZAa5*TAD-CSymAZK9c&f(X4$g&KO zmXX36FaoFAor9>K0%pF7{1XU^-rp^;t}VL+d@I~$_84<+p;qvfB^o{r z3QL7J7s-olA~M3pSy!_CCK8=!QRrc1a@`s=N9&kL;%9>OvT=+t&NG9bf=)1gO#TvX zeEyVDIxo^*OO#t!Rd@|2>p#06s{f5HYcMhBZFuq+KwVZ~+I zETQivnwJsu?OU}_ISasgm?IjgZq|0W*t>0%c#*YOC!@qtMC!d@CEM4MGu9gW+okeu z^TAWl*2?1pWaMWQbB;BITzr`n6M(1b9M$5}5q|7TikgF=1jFZWGAYPaW}qH|@U$S$nKIO4S_S#FvZkZ3G30zj zIn9RX*UqCTN06`m_qE&A3rd+LRPbS$TJA?7M|ieb&){2x7282Mr?t@4staJ6l0@p> zWu5;%h~;hgjhLmG3Wkh$DS#LDcc|$(A`N30)mP`34_g@I=>|=p!E;KU{F-5{&(~CR zp(PL`fu1raFfOA(ClVcIW;kp)I1|>69PiR}?j%PKE3X@^yy_x5sRyflu%yWndEJVz zp;Qb);j2(D*wEh3l!+)2Nwas>M} zk%GP|XDgd6VfhhXEZIGsf(YgWnY}>kW_^Se-vdw4SCAJh4Xoahr@*Yut$E0LUs#q~ z-oukTSD|yx;z38+%aJ2o7um#|NHcbOiB!E@d3bwkib&)fs{-%Q9%h6o2IJ0@zeigl zNIUc)s3r%HhWK|f=kv4~4}Km^ea9%TGb4E;bb-&AmN%~>^ej2T?X1tb97ybY`ss@9 za2UL9dT~!{Yo2I|$q}Ay<#HaQC&=v+e4Pq;5MpuyeNR4fe0q)qRTXjxE{k^>=@wTRb@mzrBg$YbSaE=@WRWRep-X~V|#t#4} zeW-!5j3pnQELQoF0jqrF>4@Q^oE`pGL?uHn(G@mt^r>=$dXLx09*c~P{S1!qP%HEs zfFuQ31=Gr`8iClS1$hkKS;lXHCo9P413G?d20e%!gq*fj#%l(LYgvM>`5jMCAF zWJZt+t^3u087Ro6_b|E6PeJ_r8$U!rr(&Y1CXfi?of6~#nnMbbWmbaRZp}tB_TB|q zh#X;ga>-x(SICJjM8BNnnX>Nfh)tSjXCumKa)f(YPWw%mX#(vs>wf_??l76YFcX8* zp0N0hNSPHYXzXYxo}p1ANBHIM%<8fn1i9Epv(7yB7{6!9l)+-Z@_-F4?}lhUEzpA)t5Hq6QV@~IVQWHGvs)H> zj*>oxfnaFeC`pjmIXd?wx6cUDTBnrcvfiv9JuS4E2rc$J{|;hZHh>=;T`%3lPvjDIF&RNxbkaf}12H*4E<^;W1}iEcyGBs(ChH6V8!RV1AToGBp zau^0AE68TZMcBS9GmX6nrpUwA(RiCGmlSB9DMnZngHZHx>yPf#utMk8(ZJY4$dMx) z!J7qU!dph5!zfbb#wZFBWa~*fI5-_hJV8N2 zP?b6D#2!J4Na2^4Y7=z3HLn?>1r0Il&M4qA+nji8Wh>XOgva>H6m@$u#sK!e5xPGq zftIGVVvIyIGlDckVi`?t*2)Po8T$Oedc$_>_x;nEy%O@Kty9x#FPrs@?7nE90w%!Dg;FnsA0_Jw=IS@TH0TQ;1oH+BQOQTRE^1sogpZ(9p3@LglE^iC-%V`3r0gXBENBs9b(NLl zRdrSO>sSoVwp=VjF2<9T)e-$6`WTNGqy+iGddo`?%ZwnOqF2R|=hgB#QRM2AD@dLa++>_+F1VlPBMS+Yb< zx0bo9l;L?}YEWzv#T5J2*7ahf1RA_ZHTo7HX+g@+$WuGpvlImxI!`5EKtYo!=w%zaoJ=`_ zylMI00z7F!I@?&GI!tL+kX7@2txnrmrKeEPK72-Cbs58|C&-w0H24%ViAeNb8&DjV z2Sz+++dN%cG&ec%Q?g$(<2KspsqjK)$Kz>AW5X|MMy1kf?V!%o&qNUP5q`p2;nR@gIYBm? z&1go&olc&4*3WHIKLFSD4RsVVV8x4~1EERmgN=C6~wl%kv__F;Jy3x!B@ zAlh>#2nS5cGst>cM}Z?FewJW`6AKbsKyiW^rEJ9vIsJ@9KE~gslv`2xI6^rdji5ZY znsHtZPieA*E5ceaj5nc1+ldrlI6^6Xz!IB5mRV?!X`K3?u#-e0UzqL{G6`v6I&Pq9 z8s<>2K#kr$vND4VMIEi z)5h`_YdwpS+J$rt&n%=hCCDkrX_}1vKr%$4!>y})X$fFFpDtG0_zon;W>d=Qiux^c zDK$@!dT4(bQhy+6K}L5*7lwipjF3QMKhWmnPG-?N462FgA5ILGXP#*n_r#^h5&6*c z?=^N3GK9h(RMAxBA*`Gr-C;l&)CUMEK8HM2^UzMQRk|EZDMFE(%@&`>%+C;N*m;FU zDAHJiFGKJwcLXo1Vq<0CD)_)UvELxE1j1+Giw@cNVLdI#5EvdNzXOUoOC+)jqa>_P z!r4iTcBrH76ncaKOSUG>)ur)uE~> zvJ^Dju5~Aeav%_%U^#pRqL&loEDX%)=~QG){5|rlhn1#ndzq?1B>FyjRWzM7t&$E3 zYqB?2KS0KqvVgz=APR+Sepxjmbp|v5GDFcd<$eFlmb#b3`I7KrosD1Y$LM8D!)u;H~9L zkxM4h9zue+e8=0kf@~_t+aoU;5%0;BaCvao>!ISoW6?3u|D^xfU+CNa+K>OA2@36g zJ>)&PiouV3LxUfs|Nk=||0CT0FVf7^Q+)b_>EAy1{49mST(#?*Z0uxV5<2BPL={zr<}*} z{wx0b{|X`hos3xBH$us)@auu!^+-&8{J#PJk9)(%jS(Q4;@1Md6Yx6;zfR(7A=UooQejx_h6joQw7cE7Pt(|`>ia|{)VzTo!z1SWN|m8k#H89|-GK8q+%;x|^a=)V>Q+X@o$*eG^Cq*w_vUYdL#r3ipJ6|PkK6Ae zy?&T1KBS8SbbHX=L3%B6_YaUw*ZKI~$}C(wcla}1+|7ri-S#xn<92D+inKe$m9%a} z@K$bzpehW#7eie6C0-jG`;E?hk?+TT+9H$IGl0E*J$8cYoA5Q5P+)J0kJ}eU`UT9W zI^3NRPJHL%+8-nBZks3V=6p%NlsNjPvc}b1XO7S%iE{z@?piHEZa$H;JK}=$;ojvT zxKSN(H(n#{rhQ4fBdtlhtA0qk<#eQNTTDmNAvd-p?K+C2-DXzOZc8NTVa3`zBR%)0 z#Am6pI{ue7U?%2{Y9ig;mfw+fiwjA+yH!cMQ+7zZlkZ5oEy<+aUEieLwhGc+RKE64 z-Mu+C|!s za+_6%yKCV{yEOr%-Q`Q9-JW^UZmB$JcLF5o*Ba}r80l+mtS$ZXbf5^_LL)L224dRO zR`?L_5QwNdx`(*Ci<7jQh$rn15GL&gQlt-HPThBA;GBR^ciI7&mU!hkdvJi?Y_j5t`y*zZxeCElL6Wt$3a|=kno1=8=Pp-x2%45_X(eF z?)x-pcXql7PtKH5gGPun%q}|2! zq}}<)q`g2vyNkYvyUh`#b&G*F^(O@IO9eN+rAzLn3ZcYVw_@M8JHvsfyHSO-TS!dW zt(GP2X30o*wLvOrca#Nbcf2lXw>^TiJNcHhZEnEW6Hl8!DII8;*n2B-$KAk0cX#9k zX?NlpX}6G#^xc8TxCLIs-EHHf-GQv6-)XGVz@#6r;|xjLT)3*Zn}Mf;PB(i?e@1S; zRmojaL>G5<1Zg)PNZRd0BkeX(k#@5Nq;CyG+YS1O`|jQtzPP>eq}@H(q}>^$q}>sB zq}{n~q}~0}q}}nKq>BT2zP)96n`Dg_{A?@}YlXi36q}|zlq}@_W z()spPgY-^Jk~v%I?yx6*dz(NL^E9SM9Mc$d#~jTgaa=RxRvXZ>yOoW!yK{`R+d53z z?O!GBHnxyvkKhaZkh%Q9w zI^pgHUE;dB&ztxMqTJP;)Ix{%Y}G4iH;G5u-I+_;EeRv-uB{?HKsGwz8)$3@s!5*P z_e3W$hiwT zR>1F3(D;~v{;~HJ9gFC|hl|f|!~gt{w{;L4@)yg@E!K$eMYm>ou@QV(E$ZaGJPI!* z`FiD#xAqmh6}iifMB;J|IlOUW;NXpHlepntbUxj5AsK38($e+QQ)m*n7=n-PtHUuG z4D3ZT{skeg-vqqe;|>8Om%HVXv^&0zv^$}Ov|9pAx*ylTTI25)juQ{1Kh}v+(r#q} z>8C^+aMutM=8gxVgI;Eik7jgu1-|*cfsd}H_BM*cGj=#O9rU1VZ|Rg%>7^*6U$yA6 z^fD=n*i<^afttkSR(uwKjv(D{B_`ZgmadSQmbmr)vbeuzIvGnbU+pZ3o+Iduo(YE% zcMUZqbO;QO+yY19Az9k!ZK8*J+=2n(-QdC5q!yTT<}@!KcYP2@KXf%5_<5L*TiHR{ z9ac!%t$QZz?hGWYtDU`Fvlvx(#3vmt+*v+4#jQR^Vxc!>dE;ioLj&H)p(iiGhdY;( zzV&;Ww^6v5hr}X)_bq}Q7O*o|8>2ajpRlKBq_;t$F2Pt(iayuBv;}$5B zeiL60@p)nN{2^E$maq4Hc(dj+ZyKwW+QgRzJsOnPWcS6H{`K&9Z^V0GDv~R~h~m*T z>|Pli8n}b`>EI4fCatHAc)Q5td+zdYy11*(NxSu3q}>Ueq}@g&(sl3&hFX+{q=9)C z+afHwOvU02X9}0uLJs17faey_i60&+JHvPDSje%jlWwLV{fYSWwl0EvnNvyLj5(D( ze7(or%RoMNr4MO$&J<~P;X7$}t}|)31&nlq3qy&C50}+$=f1@f)XR>%++u{}x!Zi` z;0^~N?e2;o-7fL#!&vRUbO}6^yaJ`HNEDB|XpHpq9p&wV9{qt^THv99J0Y7)?mH=I z-QwlVC)3c19qhv&UEJar(vMft4~ev9p=gV8lk1kqlF3~*O4@DYBaPjLM=bA+_+;zM zwYy=NJnrBc(hmh9;jX_XE@!r!K?;xC9ZA|9yHDCJ#Ubr(#U%Y?;^Ifkj;YqnR#y?K zlDO~Dvc`4YVQhrl0vFQF6Vu_tw;jerLT---X?M#AX?N`(X?L+5X+4M1%dSA?=If=Y z-mH~)De8_jUEJZtM;FCo!#ugh;_G;Id=})(xrLMR&O4HIRRh`L)@9QBEwC}pCLQ_W z3_MLmp0oyX>L&(0R@SiUCejVg*_cQ@hF(R-KGM|~uohsETTo7UQS>!28(T&P&+USs zgWDBN+MNbMdgky40eBDnvZvZ%h{IX(xVH#`Q*y~6pQ@$J((}f z-Np%Wxy6p8KkBF9u^X0UBIE18ewRDGi7c<7dbm7UgN1^ws<^|dG5-__xv%5&&>3IK zoq2T&!HK&=~kUPJD5 zQPLNq)5tc6a+2hq_yPEDYMNIbhX-s)HraR2)nyo@w+$$-$E^<~y7?G)xV6X>m!`N8 z8yNGBhg2NlY#@fAK7lL@(CtCv_7`~V>bAr)#C~YPxPE~T?-_A5MixyFWZ%?Xg39+t zSC_X5x@85o!$4}0JDGw^=Sy0>jdaM@8$i8-e5v>LBbv$Na`(tF3B4G-(HqHs5E~ee z!iRmn^uUMXP$(8iM>0UC19Ub(hi(bvL4a-_pzj9ljra&*?96kU=ol$?X&vcZVJuv5 z-2ivlDjnSQyQJG9t*(*mfueUh-XFBf%?n;EFMD^gGyUE^L09CFc6T+Ac6)$9`XRSA zpAPQq1=4OG3F#cpTZieyDGtU_j%b0Y)cZS9p;j^ogzH zAbWeT$k>Q4y~v*tezyge{O;&Cvcv-7lVp#53h`at-IQc^7nqQCS3r?I1)rr{DY_%< zh~MT1^nC@aDs3mF_C6N|(AgBXsFyxQ!B)F2sM|dt_bw;*V(ZT6yvVDBE4`yc{`%VPf%Ik`6B_7dqmXME_^dMuf0_fe*{2I6$`#(7ix=dp>6wEyD>euG(UO?-4cL z3oGKLz}&H06x$nBxE2XKdP@*0U@>!D690#>dKXjcnP0_{}7oj5=ruPxHW zgrwbCWYX>eNYb|^o_@CMFMc2CN)don#%2m9&K>D4wVw$b@&)2mRQt7msO3M3yf7=R_lpTILm(|lCHX?eDtil9lgVk?&bAH{KywQ$ISal zUi5Gt_``HNQ>xm8CSK_4WF0n%!E)CoTf6N4TAs}hJrOk^U zr1z3LXc)c2d?|8gy^~81TJVy;(7|ofro*%>Z9cX}%LIeoh34%dTZ5zW%e!rDr|Jr2 zdeIBLy>W*qYZ~g8>lEnHdoN3e2Au-KOLyQ0ed9oK_Pj>_O5f+g?iUfo6} zQP#d2lT4o$EzW?!+k4dWW+&VgOU;7Od0ZoeN>Ho$s}i5}Cm;`)>ac8SJVjk|Dhd)*CXA z5z=ejuv?WP-JO=?awqPQc9(#Xc4sG&b~j#=cE|scmVHjvG>7!iPjBKNhA?eexv_Uw z8`8&u0Pc>BBJS=JAiWK9+pb71#y2gO-tIzsUkye8V#3q?V8Ubm5WKhPDi(y^u}jW2 zMUi%QO_4r0v3!D2?+f%c(sL0GB9#6yne;X{T)hB?d_9lM`-(3mS3=3%FrW`;(?vhz zHulo{bhUm{pNEef6^{+f!nhssvgNxPG8NcXedXr#x3c3&XeN&Liz1NU9^ zbUQ}r;5J8-{uE4($6bO%+#T#i+HHm<{VgKxs?Z$J&aXR0oILIjdyszUw*Zs7OPNfq z5wI)BGXr$T0PU_%BL6M6WuNp|EYyZ+wJN9A=!HG4HyB3fqCbkpXp-juFfHsyF`WbB{<#N#mZd{L;MY# z>E&>D0U&XAfF(#jv=0|>xd_Jaz0J`jC=*BP&EVer7ZIiWbx~O}xREbKZc``4>i#Eh z)=O~sChtRZW?fmk<1xtuf6l^4Bk%o{O^0lK5qC|9q>_Lh!H zG#XZRRWrRh*c&|>e4abUnSA}rjZSEKA~_6`rfw${ohR0kHZezkMQw2Ky(>>W3DrxE zfkPX2umgPzMf4m~DbBTV33BJUkw>>jc)RHN9(S}X9dI3Vd5^dlFRqxs>T|?4hTN4= z^iUr|T&E&#?=Nw8CPJy%Dp|Tbe{< z^Yv&@Zg$)Sz2AfFMEugtrx9=`svU*_E^FNOZ}R9SUT^-`#OM)a_5GjkDsLI} zmLBimSO!=}YOnYH>v*Xo+s?ehr1N#xoHzOnyhxi_JOFLxRKC`8o39v99ID00a0Jz! zEE%%2SqKGjO0nni%gb$(JHn5CyYw#~>z|0JS!Bb@9Yd$$V&`) z5ery*Axu6pf@AmxDPdIwcUn8$whb-U*4yfoTjqNMv^#Bt{4LN&bY>)Cfdz-|lv?_m zg-wgDIM*A^98U&vKh4~qH4$R&s*b}ETz-^nET5p5jD5$@R?W2O`aYts~jRn$K)aiKRFdi|!t zp{8VAz)zZf%INfB-cq~ej?p+FFjwks4=3*K=pv27i2NgE?XI?kP&$KW za_S<`;bMM9_EL1r*Ygp*m2cDd7rFb|!5O-7g4mu-GsvcgCVFKv`J#u~dLw4xMFNXq zdyqGduO(lA{f57 zi%m$k{8mp4BkgXr`^ z4^US&Ts%39u27Mzxbn0D=aq*o+q$mUYRb*W5khpNarpubCr`IPmL|n<2bx~z$XiFv zF)fa~&(Asf8_^}FTm~wx1I?8&;xWmmAOOgXt&u=SRuZqYm^=*`rywH&UQ!%+9X93C z=k1^^EopJ&omI}U188%+IxDU`4~ecc)Jv*sj2P%z2FinMo!2p-&1+H|=VL;Zj?|xX zpQ$L0%-*$$yT_E(tB_rrcn<&l*!z^k8wSYCJexcANQNfGu?eP|>BzJ_u;7SeS{zp* zvCc6CnsGqFv*NfLrjd?JIIq5;V@m^^EDLmQlj6#&W+*8h&T+hHC#FsOQXT{-R`eeih z`?NUnehxYU3ylNq)Ic10J%%~@A)dEPSB%7B8Or?~xkOjydeIOFK$?*2Npbuk;5Z4# zKbd1%9EVzci-0?ctTyur2=FqQNr&nNAv%}qmCG^|OE-#V%cZa0X!QGEdTJIJ2V*8N6MecHAI_L%7-X1#S zkHioIR(|Qvd>MqJ6`(g;2@6>{sb1RQ{=4zw{UmZ~m|J zqX)3yTu;0-D1s59CFE1h&hI3>O6LkD{y`sl^@6uaUYf|T*;^WW9xi(9g17c5zUb-o z-dE2&&xL`b=5Qj-8$AF{MV-(ub2-*QXfHhw4z+ny9BU69Cxd3CL{hWj$a@ax$YotT z_MVP4kibFo+1MPZ`Mi3OjNm+4&s2 zMdmG5J_nu#?(%OsxZ@E?>+vSu#OE1{&tR|6#Ey7@FRL5!Gp09HUi9#1TsI4s+TG0- z$#=Ue@WM<%Jx_}(k2Yisfraija|EGTapYAz&XHI2(kC1Bp_IE5Lp0|&1++OP#W5d; zN6?X}I~*2ApCz9b*Avj<(X|l2M%MZrgFwZR=U38^r7)y3C|F%;@Gu4%>ss#E@xmjH zNpa*o_4LU;NPla^*;b00`53Y5AZntb;pu-vHlcrT{2V$mGFri6t zRF~vTTGGN~uGR z4khjeGCGV_StLV=06k1SOnns|2IdV2xIFD>hW~_n0qqViq$qb4Ch5BZJhuht-T}H- zfbJ2X-Kk8Jqc=i%D_>(uFZfwc-N^E-fjdE+Z0>q{(yc_4H!BIIqOhHwO^3=tdz>BMfOeI*%Y8Z4AAcS2J){8;7bGa!Xq@&KljKBzF-IFRDhlmpx+G8dZCW@7PB%4 ze)BE$3+?}6V9W4(2fvm0t-)^{ejoV%e5ykmP1q;@yr2Invf}oyKJ^A$pIB4fNlkqD z4^L{EM=qSykmQaQda{|0{=tY$_kZ+<@-@6)|nhY7*)hEqD0y5h6GK ztBw$9-J$#|(Z4-HB=H1J_~`Q7tn#tX|LKV#?#^{4=l`Anhrx zKOc|a^;<)SKOaZnjeDPlNjKr+4obZI&o|b0U|syDch-{`&;NE~{RfEhzkXx=21xxs z-&pUiwPm{g6&vgQ|6pVN){j_Vw&{KCX1?fVc5mZWzI4X)IL7S#vUvGV_n|+Ak6UiY z{GaVZf8|7cg>(}_c7Yia_TTP9-;R*~qkZT@zF_=p@A>Gj$@S-L;9ian`6pwN4a>Q_ z5j*i#^3U(z_IA-j(VzEhd*gP&p+Upi;KW->~ARQzuB9;mQ49> zKlZnL(e2pYR=yPdc@MUi+D(VRUTfbDiT3u;#cj6kw}&sf1JN7Jm!iD`%G>kM-7-^@ z7B0QI*4xAv>_RM`z`dnU`9c}DD{(L7Zu^i63A{4C`1!gO5%;Sxlt1r3^j`jsez>;~ zQc7oY3pKdEUUIUHotVi`FLH2iP85XR}np+X7De%+57-tr)a zg1F58T^{r)@WhkypwDXaPs@Y-1Eawi;jug{w<=q3z4c)Kq+M{@AY4M`9q#ZDk*hSq z+MHbRJP#M2@2zO_lNFL?_gm4jYxshMWWN|3TrpBYGQXNEKFm+p3t#N*P;^y!$=gxB zuEn!;DM8sE2@dYC9tOrq^$rf5fJ@mS9B6SOW0^HKT9snH<xNKpiuGXsf>AJUs<`Mkm-42` zgZ+|CaK{@w)OWrZVScqj0=9lc+bovtFER6_dwi6wQ8Bu1w103ZcygA6YyZq+aOivT z@N!SNE)$$(J?QQKJb5VV-2LCrPr%3q=X@N#@MI^ISE<#@t86GW89QVE9xOmVr`9O? zoGs5a@nGcPQ&Swz@Ts+UhEi)|L#cHf?(nH~%d0t~UssDEvFAgfDQ!J!FWQ*HYlFr1 z&lbg~r@xe)Ql*li3Utt+{p>}+7h_A;$b9lHN1W?FBvtgLQu}x)WqBtVPujc$D&~N!Yb_rzEV{7YxD_K8S+X2*`@i83(}l%- z!CPWrYU^~J4Vu?`E!oil%mB2@jdl7GPFcb7!EBwd%iWn*SHY4CrjvHttSrMDCtzt{ zrlWWzho4OWi$8cFW5^p=k9+O~-2yW58ZX#Dd1K2^ARdSu>H zLlTnqaX0i{BsMOZr4sO10kNFLh%NNYJ>`!Ks*{^=*N6soDgt&=REZyK#ylr-6r+vj z%eh{a+|GWMYO%a&teUdYb~Vo?{mZqd5e*_^m*ymSN<`)^&8c#EOiHZkG*Jald`vRB zSs|Y7!%k724&l@qttYD{qUE9?ZCY|BBzM}hKNU@jjf8c`c1WE}nief3q-oxBX43>U zRC_&3ZILy3IaO|vpxmi2`U_~UNn8UE6R`er?|Qxc+<|A&@YzvC+AhmUs^bp#4r*5- zUN6F*l&}~+M>l90zh_~d_g`eUGx>X=^dTpgk;f+{FQ%R6v58*KuYRfPSBv`j)$j<1 z%Q~%_`E|s)@b&cb=Nzilhi{;tKjHkMA^b&9BWOi1RyD?M0;NKsKd$pDMg-LiY7QOZ zJeId?gW*qzzI9`A+zPbdC%aw1s_|X9EddjM%)Z|x*wNd4s&x@8m@ff%+YnTNa2_TC zg~IsS-Ou0~ULmei?+tOXD(nj$Nr*NQqMD=|n0b5rQqaqwDpCmE1XU9{G>Vf^9;K$Y zhXPO#67xGrx*R^Uy!|q#z3NOBr=Uk+Tm1i$e3`fHhTd=E$OPBlUBcys2fU4 zD+BsOQ#<&?b9j{`#3K_Nu}X9q#`8qsZXblpVCcHNkwc&4)bV0hUBQb|bAn8ZX=yus@>Y2UdwHFvQLeu>{GWM_NwiiJlEsX z5w(kZ)%7)e7Cq0WDS!9Is@Z%A=pA3IC6kGp$V_?Ft8S|8Rb#mrcH0&LdX|8?5>Tt1 zUX?^ZRS>!YVWFW}UbUNm#1;~nVc>gc%(8h7!;u@-`WYKvSUBkqV#YqJy%0GuT1L%+;r$oOoLrqGL5tiyOk>qM&>ZMp zXf9Mc^5DvxMDH~_Bg0qnj?C$9gu3`kq&>{)^M&a=jvj>KQ5o?w&P4I(=U$Zumg&G^ zSQIS-%LX&O^}-!qMe(Zel?fbOuO+yW4Te*+2AXd{?;^EAppb~Iwyyiv!JyVIj!Y1 zP2~x;Ua;n`@8v5;K!uKcK1?#c1dA^l)yGVOD0*BnRzFxIc0xxe=&2`^Sd@Hml7E&!gr5^%J zMbOlRYq(4MiwhgWMDka#42N9Zy2+9j)g<$y(xp7=LJ^<#dA2nDS{|*+P5Un%sE$3Zp7d92_5SUeg ziQiWLZl5{~n2KjJGOqwT0v2{)vzPePA7J^8NP3|yT3!+C1Lo|y`)>aA1$Jb;Y|1Dg(^anYQ0?;_t#HZ1SnfV429#>TLb5 zphK?$m~VqtYEF^0s$lVzqIKab_7C{7p-Kb8vdp*Vz)mu)PC_8;@Y`*qPgMuYbNKE1 z4I5C&fQ5i2)x|dWR1L8B%F#&He#i|vumG5mt8~PxQozz3*nSGQ7FgJU^<`&_Ntw!W zgm))c9kBe6Loi_sFFpVkf|(Af)z4m4PXuLz-o1rkw)<}CMtz{vD$%s$gUNz5&4GOf z)(|WM49hZwEblMkATuGqwN$=6KH|=(M-Q;29{binv^f;&zo}qpwb=S_wTVDatTHdycoJUMt2{7kk~eg_D1RQaw+;rHBG4|+?4i7o3YLmjlZ_GMS+0Slg&g6v zMH!s{!wzf)f>(fLJ3PlR%5?_IcVI7(u`9s}9e$^PbpcDR9*ua@TRwFaSU_Wz{`Uf2 z4VVsyWtr>1uHhjQ%ru72D5Pt_@*UVqzk5|z@zh0X;Lqf^`_ww~uqrqJn8>`a5 z0$@f7DWmCst_Mta2>!;N_6=Z}4(tn*aH9k$aqN{iI={}qd=pTfBfQCo-3(UXz#1;_ zs$0NRjcB~@_hRV>mP~M=;NqQxSA7@J-YS?w?f@g&ZD6Sq?G6!Ze)HZKbvsZ1F)YjU zndwvAdB|{J6UzHl4=`)8pS26GCHGbIt2+!d--23S$Y-E?8f>+NUHhd^-D#lB7S!;F zPo*2EP@v9ptHi2aK+bgZCmnZzIn&XSKBG5S7HKo3*aJ)^1OdrbC~r66edDPFcsF2y zBNKZVy8D8~*Np1!0KMEjV5tsl(r}-;7c317%QBmoo!!Sn7|cW*Q=boegXKB=hAMpQ zQ}+WF0GhMN6tD+e*b+vC{$S}T(Znoyjqjd-g~6~aGyGw$*79I2siyr(=3Xmtb9Il( z0Lwd z1uP2;%Q7!b@~UTf$ai29LV(Y?zbr8arhI2TqGY`hCwzJxchz|!$+GFOl7orz#sAqTjO zH4DY83cyT-tFp|mCWATEFCQa_fTh-tR@OEodJ0&Y13PgqpCfVk^|7>h$$?q=KSYQ8 zGGGRtu`E-Qji+fmWPzDfk7hCbio>%AcJ8gzt6&8Vx%?g;^%_`mgJ^gQz_MI^m-k@) z@wy9q8^JeR*a|c=9W0Fijb`2go8iJ{kia*=vK$e2WGeR-SiS=r-PWUKf~kg~XbOK{ zC z-`W}z{a?vscrKvTWv)0xm$}tj7eV@vs33BWPoQ@LOCvxN@inX%nKP;^2R5s^PrVOT z2xf}zYj*CLx)rHMqglj<=DWakMDih6YNM#<9BS}KU>RUomT631!Pu^{99X*td@2Vl zAIzL}-TsYF<$^gY@Ud@wYN3sVl$njhv0t|cFtu?sl2&ZkEe1<>U@efl98Z~G#%~JP z$H-+nus1XLmIPS71KVEcQ%k|DiRGL>&~#`>Y*##Yas}7}>4grkC*LXg6f8M4n!7I!vI`0p za9}-&WEEJt16#;`$!f5$1A7UNpMhn8nYyr;+W$FN0hq*ZnL!+2e8EF}(`dx&8HLt> zrGgo`>u31Xmpr6{nE>UWV=Y*g!*3$m`U))1;dct^%Lglr%7s)W5wCN3-o=*W*Dfr3 zlwW-V7T+wIz&|}6wH_=L49haD2l&;uJfu6Ya%6J@SSFZhIrC^G-^u!`0MO(li89%U zU~=U*#N7?x#f?O>0ShYW|DA63)+t4uHxUMZ!LTf|7`a_Mh}+@Uu6E5;Q-$u$-g3)4`$kSzdh`6f)#?9+`Wz#_JUa}_Pu|S=&$^_ zqkU>0SZb@N-+5raxv-u-uiAeG)B3;lOZGU=fObym;`x9Jd!3E#-(6S=r<=6UA`y>E z@u@>DtY?3=IKk2!2`mvRo{e3?fOXU*R|dbwT-dd23>$!7`D`tuD=|FeIpiwt<@P05A(*L07lXyQ zu)TZO|8j$e+4d+V0m|;fiXoY-9dl~&W;;-pKpO@6!rQVMFSvunw~nSc0LJmF3OKMv zV5Pt^9N5KRr6s)9j`>G>Kz=e-}FUPp$ zz_O7uEiwKfpDGWgF4c+={jW>sQ^SDCfTrj^paLgIfDWuCzJXFFLHIs_M! zH?Hxj__oosR74Kds8lect94*hkRn(^=1{f4(vdTTw6?E@FS%2(9N~p(GXbj$Sl|G! z=YX@G3mbOar&zzURE_4Ye_wVz!2)2Wnjfjf6$}@)cPP7_F6;sPHbVbJJRin$W0&9_ zJU4M+Khwjfy08=u<2hha=_JNzW+`&bTyh;4MVg<%wElM@*y0Rmm)#ODe)6kG0)u#N z>B8RPT4E~~_Q-|y2RNLXk)I4}jhwZeG-V`p<`4h)P#2$S1DNShVaMm$<8)yOtSl}A z%XZ{$7=GKj!eFK%)j<8%xv*lR zeJTws8#z<^f4Gzvvcd8l*aIus(F7}WU^STk-Ut>Sa`ejafHw&kjHYl{b+5V^EDg*= zGHEA!nqV0YxjVqRfn__eKU4Ts39v#ilaT-|j6TU8T&84Z^0kU@Ja>h>>UO~74l|V8 z$P%*;pgUM5n2C59`s)Ff4Q2uy$By?MUVw_o!ZJDF?hR&*lZVDhPd&j2jTjHKD(2RX+z3T1z2l7N`mZ)O z&hG{cJK~59@?Cf^XGW%f&$nyAvXL`A>q+X+yW#jMxu!1v!)Ttb$`h%%X#xpBrum{1C9aw+AUop(80GJ7{16YO& zE2N8mI0TsK@SOhv_fo;K!AwZm%t7vU?!l!9;(X@C|CiQ32+@t@_}ISS4Jall*JAx zSQ?n|yOwppGhkT`xfZL~0Ts--{%gmjhUWka5HyiIcn<72FwvG%E>Om&!eH@TqJA$r z2X^=qzZ!&G06Ei`9-!e2lCK3g!3SSps}#X>1hFhLkTuf~9-Q;`-WAyu1+(Ue8zWND z;|}uq6$9-R=$+UtOSn@8=E$&GNU;t-gW3JB>RyXmZ-CCso#4J0$x&I3wCp|ywuy@R zqWE=WZV{Doqzn57xlv&1s;IJhhS-~-A62Oi@NTd%VCi5+TMN#C%>x^YT-YJ^AXp}t zGcjw}@fzono4d)U#)E~No;SViRTEr-<>?kCy0CY+MB~QFvWjwJFYRD4&?@#zz3j5Ou+|*KPH|xaxEMXvg_Yo%$xALQbG}c#43>qquq@-BPmP}D z66~MtQ?IzNW*7R^t6&9=Vj4Qrt6l?(zdBl;t?A{nz?>cCgX?|jbr;qWxiUY4Lxx1Z2&jE9u+zgFlmlZ74;r9_@qUcq+ z0~;O3{?9y@;PN^?MF|wC!Iy)*2bSsZ{KQIjS;6waj26a&ec-}wr`b{TssK4|SY~FC zy=MA;e)Mzi**mAJ4-WZM{?5pW{W+D3?-sERavT5Q#M}h${@#(-FJ6=sa@=_j=Ddzb z$x^yd#3i^!pcJ_*-j@zVOgtnvgq@ef$N0H$dQ?Oc!y<#pr!y2Ip>1Z05uEx4&Tq#C z1f--T1DFQlUZSPEjbR%Tdq^rVCSd(#63{-B^u_Rn7!+ws(G|cSqV# zERX!F4D5Lz(*KW~=5ZslNp+$>l3s1mg$bcHD)^27bX%BT2CCqq>`49}ISnr8G0s+* z1ddvZ9nI-b!(9z)Fv$=jd5q?znGy5iS72wgm!@WWiq=w^z~ZC4kn=!f)6tw1Z{hos zkL6t4!JT!thTNgJs|^h({$x&tNg27tyj6=wnu^*oPURG9R<*dTwt$uPvm1%2RdnX|3rG#$Sv=&`r-Z`+%x zAuH|v+B>y)Byb`p$$LXnJHcU6-z#}_(X7{dC|ZN0WF~jDGi1`;gE3f)dA6UTmD-fF z>G5_%ww|CepADBeNm9>(+gKfHn`^8%*fNya5hh^$<@JU7c4|zEGqD@@a+BaD(H%XqtVlTYUq zYrAEzR0{jiz+3`q{pPqR4J5bIeItuh$MS* zYkHC+9X+}2y~(TXxUI_M?24QzJgX@*xycS+a_*e!7#+)vEinP>FYgWfW@pM&_)j)O zi%k3nKl_xdPWEVdcW1}N7Tbt_F-9O@J=xPDVdYsS2!*;Q%;Z_Z&yrI?OaK!1D)$wA zo_b$2eWJZvtBUlQlIB&r-7868qK4I3=^wEQ=UpC?K2v20!g|y4eOde3#(FmS324yW z)i?*-vB%ih8jxTI&;bup6~AWnAjT;4Uj}%ldIYRcth!@y=DBDB*jRBVAb4~&Iew{R zSO<_MO9hP7h-oUO$YhutobeyPegCHD6wYXDS7W1|Epql>iWFch|H~Fjv(kMP!U#sT+eU8kWA0`dwiFT2W(4y$-BC|!2MdO+{$OQ9wTcKZ-$!=_;5DI zunx-|mox3s>FUfX(}}v|xw;|MKe4CD>%UR1B*DaIlzVx7TUTZ{qyFV>&Wy|}ots!} z^JXd{)9}dJ(z$hNkNS}(pX4bxRoD^%J4;j9J`K(hq%ESAF34?L<)}QBG+D3&Mr{FV ziNM1bWh+)Q&*8KZ@ZTc$`hsMED9vi(&%SUuJCg zun6Bu=p*cpaJ&}Mb79w}`CuBL~XRWAB)b&hvgE1HBtwV^0EzkuK;#cJ1T5Llf3zPcJfW_wQCVSdt!%X2baAAFXhkalrK&x?lxdlXhN|S9{w5G zvPRaV0Ig(+Lo;{2O)nVGNpWjh^srfcT6!>1PIe|dyc6f*REU$${LM`Hyxtmb$@_+8HBB7~(_1E3cNViZk^k#!-tDmqfMm^uOXx}3$Iw`@? zPekVtrmC2Ehl#<=JIu5AUi=Hb`#OD_GJQWmMSdus+vu#V4R>cE!OZ#9B*JLJ1miCC zbCvR5@qL9P!l`TNsHjZ#RNGyDO&;CBTY1`Jf-|LR^zW9Y5G?JR_1d|z78Z!Yh%Vd$PSU&FRSDZaU5?qiAjt6^k+`uS7hWXuDMz^?vMn4t{oka(Kxbkc9JHpe02cp))w=!B4G7e)-(Q$k<*B zipj85&P;p)Rwzo2x~zjWIchtXqje4@n*-&~_UVa)`Yft;PKPE(^s3+P-U<(rcDhJA z(rDavF;MZX7GUQndW2`!>_d31aXznMoei0Pi{Mw@=&qpU6iNIur*ud@#Pxw|HgJMd zTjN_=eFK)WVroM2Y^qs6K#XaoVeOFSTBzTz8(Rlt#sB9I+TqhfC#oN}Mt55S5*p^> zhhzY-4@N>4J0`p0IDEYPJ$u{AG)-rDi`<-K)6JZFM&X)}y5-ro%lQNSC7LeH+32of zmms*&ayE_Ey-y!JdS2i4#P^h=1U{~KK$41aj=DLrmbt;k)iv7Q#?>7$0qgJC#}hf+ z84)AHpK~s0)Z<^J_ur-J-sM`$p0$)M+0P2h3QcD7$9Y{&jD#-Fm0j+pY8Y)~ZMTmW zWM<_v{aWbYS5_cr@*o$6#RROs(I1F1DtC{JW+`ms-3LhKfGCgfy=S(L>|~@ZN@x(!0h$QR^PW4;G-OL+`<+(1wf3EiY_j${$*~zH_3}1Hr|=+) z`c95#8If%TDrNi|EtqGtV1=Aa`y4cm_L*)y@@cUh!Z0n7+9SJg!Ht%CmcSU>-Qj#x zoM(GY196s>B-A9txVt-CcmH9}kvLj4g>NcT*ovNy0q)W*u#k~B^vpq9hXL*SZ8bYW z)9!n^4q#1kOxqwd%jbXeA5!iFxC4~+(@-?@s981T>6C7n=(o7Aem-=a$*Da;>@2i% z)&Y0v_OG^f9r!q&eztNZ(?S^St>TTc1nl=8j2=!g+tF~3Ed zR#-rcCHlfJMC$}BK-KDJCtQ5gks@{$xqmyIa*l|9=P?PH);DshMs8yt6TRrJy%+S_ znz@b3$rlX8kPRyb{kud)*UU}oWX`~4-XbQ~aV9RY2D3&GOEXizMhhF8+Ip~`BZW0{ zD-FSfG{iIATS}5koV?;`B zslJ&n;-#!RK~e}s9Kt#*FBfLS!DmfJ3WV*r*>zg(RIOy1+(ov^6sSxs&NhDHJ3qnf zk$B|AMSj;0=7x!JcK!o8mVY}tagNWOj`}TKOdCbW_Qe+BlZOrxjkR|9r|~$$?NQI( z;yLLIH*+-MdcRmp!3x*RJ#9LnRYSh?zA*13in-jjlz1%=uQiW#jx?#w3RsZLF_K)f z#xPaVnHtfn(HcP&*>pBb0V`|?siT>#1$3I)UF+l)OEG7wCb#KfJ6!WDmjkTh zvoT1AWFZ|alwf=^Q{Z|Kp)%ON~Ja$Q}st5G1(nO%({NeEAHrrzYZT?JbMQfjh_F-a(*$~^J<8kZyO zycxemI-Ue7i^;kKCdR(YmQ?OEp9T=avcqE1!!j92YUaKZVkQ<6!CKzYG2tbPXN=vc zB*_Ij&QmRWS-srKx5#Mxx$b}vvnpzE_aqYiq9-68G46YM-}9YRF_Ka7Z{pfup&S&? zj5Mv!KDLyLaT|KZ%~n%DKZlywN;F|fH+gb0(HGgu^XgzmawR*M6~XyTK`9-Q<&-B* zDTQBJf!EcYzx7=^J31YVRW}Mn_AAf#dm{(x=O&eP_mWj2$qjO=pX;_IOVFf{TmSAm zIVRs`pTyn7O^+TXVKN^MuAWMA#-179hU*2N(Tk~Ey2XdoI6Vao*g4|`SbOqio|}AV zC!quG((X^+#HU^>*>~*9F}dGR-mj`v@~aKtG!P|Acv;qeAa;sRCAH-Bfoo^b{k=rO z>MW#~7D0=lk9q4=y_OuwXqa0eKJ#UqTYdt(0%|`aGPz-HosfJLVGU)qUR)c<3y_vz{bV%JsQ`Qil!$to@tg@?cvFHJ#j_|kd`p7L?vY@9zXADaGXb@$f)` zdH`Nt4vL4*>z|++=;uQCtOpbLZoVy_51;ywogncafX{>|H!Hj>_`(c3gFs3>%qOeF zZZCf@sQ_ZGgd~8}M-o)pqr4?7ASNAN%=3`sFyk>Icp}02opr%epS0a8$O9%rKc~Wr z+VgqN9FU;y(a!|~5<)6GFv0pkbug6=FJ=Lk1UFL#OB#FBkJy(mTit@ab6AYpiv3iW zs}R_=hk4ac*uK4d(GI(NU%s=9eL3Gz*nz#{B=7lSm*(Zyo!H&(_ba*5_B3yh@5U}$ zyRJw50<){4U;T=m#KpWl*vq(lw-{ZR3elkW;atB`t?u?HFZRjSeBT^--{wjVBa>5&t1whU$-cQJ$C~i>Bs(od|!ZlPi4Nw zj~&8}=Ngi__g1d?13XU$Q4V|QwH$V1_r2Pqc&$Tq!%o1iz0R*HU|)5SM@ z<}*KDMPH&mLL-&2AKK_wRj~Ku`&Cu!CdgOAF88BHC1IaHL)Ebt*XBKEdB3Y3s;PmU zGCW4r#Qun?kb+&7l|(JaZw$LT@(r;Q zxp;69wj$g{*b@l1G4^Z{&;)xgSI9%DFb$S^Ra5K$s%?f{mjIe$Pd(;QEwJB5br)l= zB!ZUM@1gou*sU+)Ene)!OZ}=f_I&I%*saL%rPxX7K6M%P+VA|TE%ro;v>o;?Uf^wy z{m6RsAAq^~G+%1R9#GDsI$+O4l^wB5AEH8HucMK4!tO&3uD~uy&N^c^Cudh;uLSRc z{p%FJx(fRTzU^=|_Kzg!8tggkJnCBPn^^*O#coLkufwi5Kjc+uFr`rK_1KLm;~TIa z{*L!gv9}N9l~e2i}#o{w_tx=hEL>Se>{&@NU=X9!M9-#pf25xU5p62V~Z&Z z@w{9;=T2601(_WlH#Ktg5vK_d`+l2Dne&Z$CdGenR}& zhwzVhDgnPAdlmw{@RSHiU?%Vz55%f^g}hAuTdZn}?3agQRi6{Fsy=l1xJ{3Z_bQ<& zykLGQ-`q;%DqBakW=j7Vqu$+5g84vU0ZZ!rdn;cxr9ODLg!80xe_BD z#YoO10Fyw;rSn;G?0lBoJD)`p_H)S2p{T_vAS!Y`i*}sPk~s4$Y7`@yb7P`OgNcl2 z)%iRq)H&)&1f*O<;0or`e^)FbBeH)bw>87gpxEb<4LQqN0u&=TGO7Hl`XRF7Ze)!n zBtdRWo(<-xl%XQE@*_?*UgY~m>GWGy^dRsV9+l3lvr1*Yg7BWL<|fR2OhA%=u4Cw~ z#tO&Fl;7|(M-!RV;9tUV${qRMuY^pUsn>Hoys%tvw?(>Rmc>gMXIfi+S)?nzoJ=D2W zDD}gXpOmlRMSF%94H{nRkKv^r8D8p>%`^Xzie(%Yyb|T#YqchHUM=23x9`NyT;U zRLogKaK6wW1^|91OH%Y0<9dPiUhovz&KJ13jIyM`GHJ{yQU}gZ(g_Bho}n@!F;Y!z zm3Y)0l9y47@me<<=M`Gyvj!%?%#zQndl(v_@pgNSA9$ z`9l&D+##?p^%){8v_g^o&6<}H)ClH7BXAO5mdL~<5|K6hY29@^lWASyau5lXtkQ)c z*EU{t0rNFe1ep@kW-AzJ{!EBMP z(t5MUjz{XhWO||&k?}vcUSyh&CN0x|B@ZGpON&^ew9eBBcPVA&N$}E*nTj{2m8YnB z=Zi?0T@TShWXoOZcOoSjTqC$In^=Myh4s=^2X|P))6j1Gb9N@IB04E>dFiO^%D}f2 zNv)J(aLO{AO2&t5X_<=#=Ll5y7t$I4mJuKjw%h8o5X=DjBderI^fy%SV1dXt$;L^H z%p@&?^N)9-eDKR|(h3-4%g8t!oU$BmRhrROoz=-`R_27k#cq*M5$(%7F<9W1DIy|M z$KcRU{wgM!Oa^EDrHITggKH28m27^#1WR{q+WqJBFsVAP>Da*$D@Z{ZnFpIT(t*`M zFiYU8rHC@L^lomAn^5*rMwuGV!k#lo_rEfhn)))!-BBHqFw4uJVHx`6H58K7@H0Qf zDKSq6DPx%FgesHZ;Ctd+d9Yo(Z^d3D+eGxKQu9)zn_3?dk-8aLMk46Tr;KgG=OcR4 zkaUk|HOHYV5ifH=5CMXbe9a|K!Pf<@ImE6DG7j6uqn_mcl(RAf*N9}5_s%qV`kx)- z#>gZSMzBz1d@@N1o)otEKu7&zFY{?$1cNK{p3agCHkLr|ScqFN>vQpHO>lLMd4&Xu6`Gehmu=V`cXYhgSe^X^L6(;Zr|A(d)(wfDQN!uX@F-J8 z6H51Xp`s}c9u?X4W<4V+Zi9+VzVk`RZm1A?`+FS>3L1;dQJu>87tl@K8iJ`}Et#xl z>ru7b&3cC=5|T-xNlq1t!KuICh%Y5mGIKVW>Q9Rl5q>t_nJJkon+{~Sd%(#TQJ-uQ z1UC!YJPGCLEb)C+(kn*tBr{nPOgGkbMG`Y*Eq<%W1lNcxr)m`uSu7$xS)lQoZ4#5r zLo>7+!pPL&rIb^VmZeg1*BiG@Pw13H`WP6lOv@EiWhKIRp&5U*UEpM$- zsT9%!XP9c9Cr%}$!HAK)fZ%$8n!oDm0Ve8*WRYaGKgrk8w_L@Y`89rzRH{i>?8d1* zW4)>lylna1HHL3e!poN48_b_CgJ*}4?08i>_)*I_WOGi z{2TCN=d&R^mg~~fc^JjceI+80r0;sxt8$6pP54dB`zFDYHuc>pk7@=#6MiyZO!;NB zSIvU&#Q>YM!LMe+%U6w$k0L_&_BDNKD*QX}X?(n_3OqAibrtpDUK08){LY%>|1(lL zSAy($6zefaI(Sak!5mamkwJQ|}mkT^1> zT6EyoT1e1`@FDi}p9cR3zVIu*ih*AM|JZnbaFGn;i2g^<_o~B0mJ6T3$>JxZ6m6=7 z%pxCzUj%;@Iap1q7sHo65~J$Ce++*-Hdc)$(R_hjEj$#XcE8|NOX0^3;DhtXtE_f9y&iLLRRCfn!Jb74YeE_<-SsvFcO!7fSe4ukx{K zCHza3_<@jev5E<#8bzW=Wv4@tC~4;Ck!y(D@){6&OQ9sXPR=Eyf81G2YvJz=&W1K+{NF@=3`H2Y8T^_`PH zW0Pv>(^nDbVN(4A{Gp&vT?D@gKAAvoCkLD1uOXlp$ia{B`;b{iqPM`mmJ*{*ljyDR zJ@bSpcB?Cv`n-gXpiT(rrs~`BjUVoawQ6A<~1h_UzXLQ)|$Kj`oe9WuR{>*+iimdzs zzxCbrF68V7n(jC{6UW2`U8t-y1OO)=J&<0|L-)m%=cT9Xid(@!(s+(etk*!INIz2KNFeN@QOss z$J)#nTfJ`R2n`~~n&u{RK!z(W}x7ER# z2HzjP9ekx1xGzJ*m&4yRllcP)og?xU*~<7O;@FDo-@Dt(h zfuBbc{}BFo2oH@3D4&NaZ}Y1}#F#=zfElHFV~69?aRyp`u{DYs4fq+WBI8RJlBIST+Kcoe0}&BZkttvZvg*u z40{p;+7SM?m#I|nE#R}+6pAC4m%)#nV+v)H_Mse4Q zME8>U-b299qyr{DgG#>i$u%D~em&1FgH-C2&C|jJe>XfZn*-n;awe0-J zqC$3{<-kHtB;;^IHm2lULH0al_d@n9WqY4p^N@9RC_6B+x)(KzdSy{88~n2AC3{w~ z)|R!N>>HVV^k=!_BA<(tb*(JCL<_PB{NpMHG^jy6T0;!;f4+{KPZ%xy9(8wJiiCK6 zXO=5>XhYNJf0xwosSEL(^$`mMy4IV~#Q5jw+wWrkJg8Jcah)L z)2A9URehS(ntVR1&vFKH=E^BH9CVx^i{b3O-Yi{Lc-5Dm(D`ErvvDt(=#EMXbwfkJ@hi_%Dd5OOF-kD%bo}_d~p5|x^OiCk|d6EoF zmnMDg`)~gjBilb~(v1KA2eYXE)H})n+q0qb%%X~nIeCAgu7m%09`J95^U(h=cl=Me zHj@-RK?xO^p}1!!Qij32@c5XLce?B1zv*Ut^l$_E`&2m7o+r#EDj^>~HefB*Fg z>Fx#*PZM`McT#_)PD?$Oy552Mn@oN0m*P`pFJO2ow7hK~I622RCyef3V%YS{XvR$% z)A?o(CblF`h?%qGT5jXWsh7;Afh|ug^yRi_?@&~ers@PR?U9fXEMJ6siRV7;x`jQGxEH|lIL!= zkf<}k@G#Od_q^%p%p60`VBT=j-R&=v75WD&HM2ky zotj13L^fS{VVLm8{NsMfG=1m#B=mO+6zKx23vVdId?MG>>s9O=2-by$Cre5(rC%Z6 zFOaU&9%%}HHy~RtYyH>7(?1(x{&Iu~{nLf|f9h<5`6De&oL>u!fB)+e@_*7o=-+Ku z{3k6~E69S;XyU=M+Cu1G>{^5$;IN^*U&*vbUTKu}a1XN<*9>fr87B8mzmZ3w8QLpruGFApNClK#gkGZ2Bl1rR&wZYsUmm3OV{+DteQOVYg zR5_WH9AyJ&D;txOD=?2?-Xcb-B&$AI|FDlwq`~Zor0j$9j&lD*BNC{4nf2Ehq5t`- zjY3&d|IEv{gLr$g?(>{_vYx90xg!b|P9pIatd6%bWmODXV=!|v==Q%_qK5u^qN=bI#m4$TZtc=Muw@UpZPW7@dzQn~Hz0`f2Yr|izkKBR2A%B^YHu9M+QHe02t z$X1>#GiA0et2EgPkey$dMa#-fnw#wE$`;@GI(xa~C>y%6l^{FC(vpXSScFJVB=c4o zie-CP_8w)dmK|Za&?Q^Ta+OM&pWKC#1(SI{Lz=H_p31g!Fgz7?Z}Cf_CX-8%$-)+G zh%L2DZiYy8pN}nm z8k|$D@TgtP8k0B#?feeEZoAs2PF%oyHa*xnxtdq~9`LK(OFZiP-$@X~H+QK|eG=U-9p{(Oe8%Bpu$S8dZ{=Uk5K(ImI;qM!M?^~ zkD8iCJzC~b&$HQncrJ4ApRVP6mEQWMcB~BYI5oP}r=Eh+lR0x^aG2ecKW}S#2YU`Q zp`reCLA-t8O6o5s2iCDfw^NZO{c?wuDtv{a_CCubaKx*TW&Lskp*6394EMZMn)Am_ zoW^slqkU7Kstq-RDni#0L;#ZS2!4GH2jctqRlNdK2F-=G)Z(T$Yqa-zQ}*w1w}CN5 z25%W(wm!*qf=+~2lhXpIIaD7ywHTH5<0#={{@km&U2rZi!Q$b&XRaE5@m@o#NC4utu%o)Sipu z)PSc&OzD%6xeP5UE=p?GRpHg4R{XZOcX@*!T3gVwF0wh-2`54cFudn&UN znDcoQ{LyW(>P}w#6uuwTLMWjFr^?etxXBD`$2T+y~H{R<@tx z*y~&IB5$aZUp=qE{vG@rmvL%IAX}!{seFu%)I>6p0EE92`F^K4?S$lcIvKeABv+&y z8QJz`ta{=l4w$;z3BPSPr&;)GM0~5Mm;08BUmDU(B5WOJ2PA=YN{;5La!Y>yu4mNE zB;=piO=UKgJ%dtgo=;cTG=_uE2{Wk2wpqZ-$j#)3s?!|clQ|qXBbWge+$(-dK8Rck zpu*?){6P3kfxQ?~h3m?l0G(Ya@S38YZ2j9|pC{M3(8gbC~Zwvk2;kq9nUS#HK%7WpwG z>WfI9hjQzBu8oYs3gyj`)c<}%jGDtM+rf?U_(JT`ue>VU&b)Sv$Ls|DaJ8im=PJW|Hpz(E^xQzmdc143XYW&g$F{3m{UmqKZeg!|h)(5JD9+{*1== zuJJ3OM2$bM@g!u0Dr$U;#v8Fl6Jj=Og&)!QwS*y5S#T-;EbWlW?IWQoV3N|=8o%oU zrUXz`@c_N2@pnTpYRkubN(M|C+d_>mdM-xgEhbSKU#jsG>cim4T#eND3UG;Ez1^2d z3Hy1;+TkjbEg@^p-974fUu_>#PRuYHD^^X-HXlI$1lw!8-MdJDO#OD~lzVNE9RmkGQc zuNVo?x(XNH-q^rwm2f2AKbhnXjZwX53k@{BQ{&A@_3Na%A%n6Nz)XM!B<3ROzm=Lj zS~8xfVu-4d4&k82TY$F)Z%kMA9!Xf{{q=_!CDa5-$&Jv9eM@ugj5DhaLHAFjnAZRBn*jB9kl!t8V`LJ z=U1OX9ks*L+TjUqQzuYqFV_KuHNK0ESg4c6U(on|!q^I3p~D%k@wJrgPSns@%SSZ+ z{A`v?v%Mkf(?F8aEbVX|4sStSw1?RmzY}Z;bd|>6*Z2Ui@1d(TzDVOiu(8lJ8egID zvh=C_vV7`V3#a{msT~Ht!xbQ?tM;%#2Da06!e@K-+LY3}8CC`;A{RuUABQ^LA>i9wd zDgsnn%)GTHm0Xb4iCh?di#f!dgd_8X3v^iJ!5cHUrE9#L#`7A)s%)qiy|WeMl~mUr zbZgA6Ml2%4W1avXW*kF#_r|Mavx4?IAtgqgWG&vuVmf=d^Dk;bn@@j~}$`KBT5Ae&P{{j@_1jmwXg z3Ei*pRvLd1#g`_p4}go}+i3j4Fp6S0>5ra27CqObBwA4t529uZcoM}wLrFYDU-Gf^ zKdoP+A`4~cusZ6ns?(ReRV~)~nwa!>*J!*Rcou!nBj|Yvadf<%g?<}y`zS(^+Z(mu z2Cy3$kRAh*0B+TIOG@oR=y4f;#KWC91b0hVt($>gfj`!p)+Dfx_A`+TCz9a-;L^?Z z(|8gY?nj27VvVp=GJFvk4w7MhUud-j3?jqB$newDMFD<_Tl_5F>+J4T+}8|Qxhud7G!1`*7$>L%?O3TB!j~=zC-qUZsOA@V3OF;8ea|G z41BQ0C%w|!;lR} z>YfK<6#LOul{u#IE(I~%f#!$Hz$M3jYJ36p=w|S78ZY*Nt?8{S0A^F!$J=;FmD3LU zaQGaD3ED$djo(EC^Qn9jHC{*KYl$Eqe3HgfHGV@?pAwQSxROvCjo$_)6w!Dm3#Uf) z2Nas39n!Riv0y?|HQrt0kAn%lr18EQ4}l4>{cc74u*Q=a9E7HUOVK=|@&0JEe~3S? zXou&uLn`VQdKFw$I!5E4-^lkmq1QA%MdRvi20JKA<8NquKGOuD*TE&?IT}x*PZ4?p zEF=yeYKN(SLes&d*(}j`eoYTAUGXx8##d^*68lY8L2qh&t;VNOEY;~N-l9`kMT`I5 zyBXgjZ)X!1Nr`cTmb@p#G)FOR%+d~9wZpC8dkAK>#&>JHJnPB?@V7O7K;uI_ymm8? zJu`68*>R0O3;q`P94+skZ&yRv*0$(f9He2C)(+Kn@VPo@uEygve%&x;AkaK;>1xVr zyzW4j3Q)GjD{DNXghx$=-UAn1*3kHpD!lFiy>H`O0M!n?%Xw6P=mYJcsm80*JG>0d z*LZ7O;%p86P^bwLCD5xb{o#a9V_yRD=Y6p!U+{V&pAAfQH zDF)R^JM@2*ccMn}P79cHw^wPrXT?}0v=B`4l&0}ojJ86HG=8hbKe&T1pvB-)>ggI^ z$<#{dW9k2;wC>Xme{5&Z43b@N!5`K53Jwf}mTLT2jsIMcPuW0u8XvClo$T)mEz|fo zjTfHgdjQaKjlVo!_y66$@+zTEw8NX)L%&py5?TQ+oyk0nH!jJ06VRs`U#RgrFZ3&+ zl^Xw4<17E*B^+p##`86PcW5g^A+%aMY|;)7P%J{9X?&-~eaH%ZuJHpJzZO}cFEoBq zdo}kc|+M%3w7|akQv{vKQG=6t2UQ2+!(s(_MKLsX~ukq#@ zUtNP2ZlHARCH>_`ZGZR5RF7wzy1sS)}{d$>vCm1w;}>otC-#uspYBlNAt`)T}m zJgpzvpz+5)jO-trTOkzI?sHhw3T@QxBQ^eWn7RagukpzmznsN`&<`4aUE?hREP|m; z8lR)_%b30jZPxe#8xN_+e`ef(e$)=jwTC}z_>|BVjen`}AL#0ZwrYH%#=knqtBX*9 z#W28%^7^!!hlUHi&m8AsU=jx&0s6bz}aGyh#l0(0Cb* zXYv+;(9asLtnrtqEukq?- zy-Mhi#+PdRhs$G>&|!^#uJMh8A#_CJ-)cOLFogb){7b|I+F=l{ya*lD9``}TY+_Si=ua)s zNaJI2x%mg3*7zkFA9@3`a7acr$w)_yH)M{vfSqg)xQt0%HNKGXMaT;t2Y!o;h;vNK!*K1P8H1b<69)?)qwy(ycz+6F$g%KA8ed177AmFjX&S$j zAwsA$xM*d%#?!#kwuWL9Z!TF5?`VfF{$%Wc&hR1R_*H<9jsz zK4A#Sx4k8y2Q}Vp7~3yUMU9^TxB7xdd38vrl6LUr*fqLytXBzD)_6&c4@Lb#RWx2+ zdaU={SYxhev z-ktliLNzqrQR5G-;-z4yrpB+<_|kE_I1Hs|{6>w>V=xn{rSa}I9#Sos$_v%j4!yO9 zv8*@0fa+-cevQxg$g8rUx*C5}<1_i{(tA)njX$mN2bjB0K!f!)K1AaS7&{gWr%)Pb zhmqQ0%5~IwsG-IuXnY=+&_x=5S>wlOnnK+0uv9)><6oz6;0`s`_&XY3#Nt?}iQv_w z)@z6D_j!~MGe0Y!MLCf>M^Z$eX!qJZ&=N#xSngkFJd4$aP;-rcqw%tI%|c8IEcs0u zfAbC&PY`z`EPT7hpB>NU2*lMN3*TeoA$18m??QZI$8tERJv3jq1xji1o?zF7=* zP-~6*a_vfI~8V_jv6djCEP;hCtU9`h!)GX9Nd$_?wz_!2$ zh-rbPq3#+_zT2mSF4uT(jbFh=nouW=->>n8acs;$S7`iEaI4?gRg)PF)LA<`tvyU( zUrFdnjStcIyGcGJ)J5YXHU2?;E)qajX?%jl=Q3Rrx?1BeYrOncHmmuguF($DwZo|` zTmylw)%ZIauT1k0>ZO=g9&kq$gb=m?a;IW2U$=z z?QlZlize`O0q9nZ`xe@@y&I_)x=rIHHU7~~1~G_@2`hr~8Xv|oM5w#Qt7tq__j`If zh#h*%LyC52115Bb#v6hMXZ^~m{CM1#Omc+o)NakSpAVQ{2&HTMQjM=+i6GQV;~h2L zHHE_({;0dO!`0ehFVi8R-WtDAc!*|Bj8+L(u&i zpP=#k7%wtO{R0|*Iiwu|1addj9|!5Brfa+*t)mX~pvLED{7pKX9QH0B()foOzl>7U$J)O`~ z;Igw*LgQT+>RyBff-{#^Wi)>LNv^&%itK5 zypA`xaPZ;bLXFGr?|$exa7obrqwHMZteX1&zh};wbLPzH)TE12G+lHNniRQ2a~`*- z8228+P!htpJ#sxG(O_uO<%|plGlVb*HKv*|n`?Jn>*VOO%yYFaA zTZbFppQY)<>rc^x5kPBGadXheu?|CujSn$i$~Gp+Jq%vezo{!odz-HKbGqGo@v2Na z%e;O^A0)XCu1p(lya)F-PxAbx1g^9sMwr7TyjVhVKMv}VFEKtLi}gd~0pnL1f4D`O zCz)jY2IEU;?vhft5_FsKV}56|Co9RmMZLG%k*#iZZ;3=zq$13*)_6 zpdZ9~e&T6!XlD+OqUcE!%{1QG_(>%60-garWBdT)Tj0kM!L!Eu8NZSXXygK(Gd|Gx zx#+(T{j*X$;T>-d87SI^2%fh9rx>5fBdsry7vQSU=NSKcB0Il|S-poVtIsw5%ZJ?1 z)$?*l;};p9!z$nh$Vlch_^%Q*1oU2OsO3+n4Ov_7CBE;OD#m)C$GvrW-; zwaLembKCB7v$=*@t0{4uP$8$Z{0MQ6r$f7>zfQu z@|E#+#)soq(qO!c@rz)RuZtmjfl=m_wcg=t6autTTSH@fRMW z|3bbsex~uy!ek4w-uMN^+fW{o?~IQz{w3M?HF5z0;h5lgt#SXk?75Uxx zW?v6keirhF@$D(j9!1JdvIPhA?wJcxb?TWT)A;yWhPM^2xlGh}+R=Q}4fzuuf@d2) zmmX2_m+`j72ff4RUXZ`x8lE~D?+)v(z5UzFp{qGWs5Fv);7ZT|zM^72GJ|Y4eh@rf zS3D&nI==nuOFb{A7Y%G9mEf!kf`x9jhEwB(#-hq6i;}4P7ONYcHJo& zVF4CiO1FwMH(p@;uXlM;g0wI`%6NEMy8SfdznL_ zIXuJ^MAFLm^~MKevD*x3ZG4>Z@9-;WWBgX*^CRp=Kp0P4#6`vrhDq38;IT*0^CpRYy3lWNV*%ZGrkZVk{&GkxB!dH;bW9Y zdRl-b#&1B0q?hq!#vewB~-H+^b7R{nM1Ax7|o5CCHLnBZ!%mR!s{sW1T@Ebwrzrgr;_?577;`k`z`;!<+zVR`}OYti? z&G^{5M5;Cp#Ixjdb11X`L73zW{6GUZ@k?2UT5(Va4z=(;}ymimNHBu7aFfL-g`0=Sfs%COyl#4*qer2 zl;ZUN=I{cYjpSkrP;LD2x$%1Ah3J=DVSJ_W_a^eV zC&9n5=CH~f{$xfnhyYg_Ut@eN$|YABZ!kWp6;Dm@f3@*-#;4Wk6M5u*zGWm4fx}Xw=_O@1aEwU-(-Am<0rT0 zjT9FLyqk^hYrGSYb{WOnJdJlX{?8p;|37!|qX8VWI^4?~9&4B8Np3TKknur5z6Xii zZoIGWA3cvDOedY5LydR-kXa8>Wc&!@6~EIgkvseVN1H=G_Eky76F@~1H$L$+9wKyN z6FpoDuO}G)?hhuP$OL!NBhIeO0z`Muz#l{b2q4je<6Lv4Empq}!Zie*W z$?tuT21kZL{=!cQWUC{EUoxLce39YZ4=R09!D>M_Kpue1bYv1_Fk}*>&XN65^bv|m zA*&p@6hArmnG9)kWGsH#6Ft=`UR){7FW~1={7ivVh^)OlxXR`x<0rq(E6kBH<98UJ{0jTSkcZ$2 z1-Qo?@_*;s&-#t=75<3vD&woe zd{Y5VOLP8T@Y~;*-}zxL4v(3`>lWav4HWpdd``f4o$<3bWq4=)$}caCFE#!p5&Q>v z!uUtV$D+R@@}%+4jrTi|`rq$Fz7B(fYT!C^8211TAE|;XC%!elAe((R$Ww6sybZ=% zZ%X$hPn-WAjIS8L`WrG6uAKhK_<+M%bU>a_`%~8aZVp|65{lXJ?Zyv+NuDzvelyjj zjp5mYWR^vcZTxFrCw?XG7++z0IZU#|_$uR1 zv}5Zm|GcH<@P#?NBPGbY#@8Az#;@c({Ch}9ZSA8ewOhVKU$HjHGZz~H+UW(`Nna||3Y(knHM=o)>(j2#+R<)ry9tüz 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 diff --git a/packages/php-wasm/web/public/php/jspi/php_8_0.js b/packages/php-wasm/web/public/php/jspi/php_8_0.js index bcfb4b9e21..448b5cf169 100644 --- a/packages/php-wasm/web/public/php/jspi/php_8_0.js +++ b/packages/php-wasm/web/public/php/jspi/php_8_0.js @@ -1,6 +1,6 @@ import dependencyFilename from './8_0_30/php_8_0.wasm'; export { dependencyFilename }; -export const dependenciesTotalSize = 12310816; +export const dependenciesTotalSize = 12391870; export function init(RuntimeName, PHPLoader) { /** * Overrides Emscripten's default ExitStatus object which gets @@ -38,9 +38,7 @@ export function init(RuntimeName, PHPLoader) { } // The rest of the code comes from the built php.js file and esm-suffix.js -var Module=typeof PHPLoader!="undefined"?PHPLoader:{};var ENVIRONMENT_IS_WEB=RuntimeName==="WEB";var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER";var ENVIRONMENT_IS_NODE=RuntimeName==="NODE";var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{fetch(url,{credentials:"same-origin"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+" : "+response.url))}).then(onload,onerror)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;SOCKFS.root=FS.mount(SOCKFS,{},null);if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();PIPEFS.root=FS.mount(PIPEFS,{},null);callRuntimeCallbacks(__ATINIT__)}function exitRuntime(){___funcs_on_exit();callRuntimeCallbacks(__ATEXIT__);FS.quit();TTY.shutdown();runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";if(runtimeInitialized){___trap()}var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);function findWasmBinary(){var f=dependencyFilename;if(!isDataURI(f)){return locateFile(f)}return f}var wasmBinaryFile;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"}function getBinaryPromise(binaryFile){if(!wasmBinary){return new Promise((resolve,reject)=>{readAsync(binaryFile,response=>resolve(new Uint8Array(response)),error=>{try{resolve(getBinarySync(binaryFile))}catch(e){reject(e)}})})}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){Asyncify.instrumentWasmImports(wasmImports);return{env:wasmImports,wasi_snapshot_preview1:wasmImports}}function createWasm(){var info=getWasmImports();function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=Asyncify.instrumentWasmExports(wasmExports);Module["wasmExports"]=wasmExports;wasmMemory=wasmExports["memory"];updateMemoryViews();wasmTable=wasmExports["__indirect_function_table"];addOnInit(wasmExports["__wasm_call_ctors"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);return false}}if(!wasmBinaryFile)wasmBinaryFile=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult);return{}}var tempDouble;var tempI64;function __asyncjs__js_popen_to_file(command,mode,exitCodePtr){return Asyncify.handleAsync(async()=>{const returnCallback=resolver=>new Promise(resolver);if(!command)return 1;const cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;const modestr=UTF8ToString(mode);if(!modestr.length)return 0;if(modestr==="w"){console.error('popen($cmd, "w") is not implemented yet')}return returnCallback(async wakeUp=>{let cp;try{cp=PHPWASM.spawnProcess(cmdstr,[]);if(cp instanceof Promise){cp=await cp}}catch(e){console.error(e);if(e.code==="SPAWN_UNSUPPORTED"){return 1}throw e}const outByteArrays=[];cp.stdout.on("data",function(data){outByteArrays.push(data)});const outputPath="/tmp/popen_output";cp.on("exit",function(exitCode){const outBytes=new Uint8Array(outByteArrays.reduce((acc,curr)=>acc+curr.length,0));let offset=0;for(const byteArray of outByteArrays){outBytes.set(byteArray,offset);offset+=byteArray.length}FS.writeFile(outputPath,outBytes);HEAPU8[exitCodePtr]=exitCode;wakeUp(allocateUTF8OnStack(outputPath))})})})}__asyncjs__js_popen_to_file.sig="iiii";function __asyncjs__wasm_poll_socket(socketd,events,timeout){return Asyncify.handleAsync(async()=>{const returnCallback=resolver=>new Promise(resolver);const POLLIN=1;const POLLPRI=2;const POLLOUT=4;const POLLERR=8;const POLLHUP=16;const POLLNVAL=32;return returnCallback(wakeUp=>{const polls=[];if(socketd in PHPWASM.child_proc_by_fd){const procInfo=PHPWASM.child_proc_by_fd[socketd];if(procInfo.exited){wakeUp(0);return}polls.push(PHPWASM.awaitEvent(procInfo.stdout,"data"))}else if(FS.isSocket(FS.getStream(socketd)?.node.mode)){const sock=getSocketFromFD(socketd);if(!sock){wakeUp(0);return}const lookingFor=new Set;if(events&POLLIN||events&POLLPRI){if(sock.server){for(const client of sock.pending){if((client.recv_queue||[]).length>0){wakeUp(1);return}}}else if((sock.recv_queue||[]).length>0){wakeUp(1);return}}const webSockets=PHPWASM.getAllWebSockets(sock);if(!webSockets.length){wakeUp(0);return}for(const ws of webSockets){if(events&POLLIN||events&POLLPRI){polls.push(PHPWASM.awaitData(ws));lookingFor.add("POLLIN")}if(events&POLLOUT){polls.push(PHPWASM.awaitConnection(ws));lookingFor.add("POLLOUT")}if(events&POLLHUP){polls.push(PHPWASM.awaitClose(ws));lookingFor.add("POLLHUP")}if(events&POLLERR||events&POLLNVAL){polls.push(PHPWASM.awaitError(ws));lookingFor.add("POLLERR")}}}else{setTimeout(function(){wakeUp(1)},timeout);return}if(polls.length===0){console.warn("Unsupported poll event "+events+", defaulting to setTimeout().");setTimeout(function(){wakeUp(0)},timeout);return}const promises=polls.map(([promise])=>promise);const clearPolling=()=>polls.forEach(([,clear])=>clear());let awaken=false;let timeoutId;Promise.race(promises).then(function(results){if(!awaken){awaken=true;wakeUp(1);if(timeoutId){clearTimeout(timeoutId)}clearPolling()}});if(timeout!==-1){timeoutId=setTimeout(function(){if(!awaken){awaken=true;wakeUp(0);clearPolling()}},timeout)}})})}__asyncjs__wasm_poll_socket.sig="iiii";function __asyncjs__js_fd_read(fd,iov,iovcnt,pnum){return Asyncify.handleAsync(async()=>{const returnCallback=resolver=>new Promise(resolver);if(Asyncify?.State?.Normal===undefined||Asyncify?.state===Asyncify?.State?.Normal){var returnCode;var stream;let num=0;try{stream=SYSCALLS.getStreamFromFD(fd);const num=doReadv(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError")){throw e}if(e.errno!==6||!(stream?.fd in PHPWASM.child_proc_by_fd)){HEAPU32[pnum>>2]=0;return returnCode}}}return returnCallback(wakeUp=>{var retries=0;var interval=50;var timeout=5e3;var maxRetries=timeout/interval;function poll(){var returnCode;var stream;let num;try{stream=SYSCALLS.getStreamFromFD(fd);num=doReadv(stream,iov,iovcnt);returnCode=0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError")){console.error(e);throw e}returnCode=e.errno}const success=returnCode===0;const failure=++retries>maxRetries||!(fd in PHPWASM.child_proc_by_fd)||PHPWASM.child_proc_by_fd[fd]?.exited||FS.isClosed(stream);if(success){HEAPU32[pnum>>2]=num;wakeUp(0)}else if(failure){HEAPU32[pnum>>2]=0;wakeUp(returnCode===6?0:returnCode)}else{setTimeout(poll,interval)}}poll()})})}__asyncjs__js_fd_read.sig="iiiii";function __asyncjs__js_module_onMessage(data,response_buffer){return Asyncify.handleAsync(async()=>{if(Module["onMessage"]){const dataStr=UTF8ToString(data);return Module["onMessage"](dataStr).then(response=>{const responseBytes=typeof response==="string"?(new TextEncoder).encode(response):response;const responseSize=responseBytes.byteLength;const responsePtr=_malloc(responseSize+1);HEAPU8.set(responseBytes,responsePtr);HEAPU8[responsePtr+responseSize]=0;HEAPU8[response_buffer]=responsePtr;HEAPU8[response_buffer+1]=responsePtr>>8;HEAPU8[response_buffer+2]=responsePtr>>16;HEAPU8[response_buffer+3]=responsePtr>>24;return responseSize}).catch(e=>{console.error(e);return-1})}})}__asyncjs__js_module_onMessage.sig="iii";function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module["noExitRuntime"]||false;function _SharpYuvConvert(){abort("missing function: SharpYuvConvert")}_SharpYuvConvert.stub=true;function _SharpYuvGetConversionMatrix(){abort("missing function: SharpYuvGetConversionMatrix")}_SharpYuvGetConversionMatrix.stub=true;function _SharpYuvInit(){abort("missing function: SharpYuvInit")}_SharpYuvInit.stub=true;var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;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 UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";Module["UTF8ToString"]=UTF8ToString;var ___assert_fail=(condition,filename,line,func)=>{abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr);if(Asyncify.isAsyncExport(func)){wasmTableMirror[funcPtr]=func=Asyncify.makeAsyncFunction(func)}}return func};var ___call_sighandler=(fp,sig)=>getWasmTableEntry(fp)(sig);var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);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.substr(-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.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};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).substr(1);to=PATH_FS.resolve(to).substr(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 len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};Module["lengthBytesUTF8"]=lengthBytesUTF8;var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};function 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(typeof window!="undefined"&&typeof window.prompt=="function"){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: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,0));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,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var zeroMemory=(address,size)=>{HEAPU8.fill(0,address,address+size);return address};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)return 0;return zeroMemory(ptr,size)};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,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,allocate:MEMFS.stream_ops.allocate,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=null}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.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){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.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp},unlink(parent,name){delete parent.contents[name];parent.timestamp=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.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key of Object.keys(node.contents)){entries.push(key)}return entries},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);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,arrayBuffer=>{onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=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_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var ERRNO_CODES={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135};var PROXYFS={mount(mount){return PROXYFS.createNode(null,"/",mount.opts.fs.lstat(mount.opts.root).mode,0)},createNode(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=PROXYFS.node_ops;node.stream_ops=PROXYFS.stream_ops;return node},realPath(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join(...parts)},node_ops:{getattr(node){var path=PROXYFS.realPath(node);var stat;try{stat=node.mount.opts.fs.lstat(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}},setattr(node,attr){var path=PROXYFS.realPath(node);try{if(attr.mode!==undefined){node.mount.opts.fs.chmod(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);node.mount.opts.fs.utime(path,date,date)}if(attr.size!==undefined){node.mount.opts.fs.truncate(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},lookup(parent,name){try{var path=PATH.join2(PROXYFS.realPath(parent),name);var mode=parent.mount.opts.fs.lstat(path).mode;var node=PROXYFS.createNode(parent,name,mode);return node}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},mknod(parent,name,mode,dev){var node=PROXYFS.createNode(parent,name,mode,dev);var path=PROXYFS.realPath(node);try{if(FS.isDir(node.mode)){node.mount.opts.fs.mkdir(path,node.mode)}else{node.mount.opts.fs.writeFile(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node},rename(oldNode,newDir,newName){var oldPath=PROXYFS.realPath(oldNode);var newPath=PATH.join2(PROXYFS.realPath(newDir),newName);try{oldNode.mount.opts.fs.rename(oldPath,newPath);oldNode.name=newName}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},unlink(parent,name){var path=PATH.join2(PROXYFS.realPath(parent),name);try{parent.mount.opts.fs.unlink(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},rmdir(parent,name){var path=PATH.join2(PROXYFS.realPath(parent),name);try{parent.mount.opts.fs.rmdir(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},readdir(node){var path=PROXYFS.realPath(node);try{return node.mount.opts.fs.readdir(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},symlink(parent,newName,oldPath){var newPath=PATH.join2(PROXYFS.realPath(parent),newName);try{parent.mount.opts.fs.symlink(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},readlink(node){var path=PROXYFS.realPath(node);try{return node.mount.opts.fs.readlink(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}},stream_ops:{open(stream){var path=PROXYFS.realPath(stream.node);try{stream.nfd=stream.node.mount.opts.fs.open(path,stream.flags)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},close(stream){try{stream.node.mount.opts.fs.close(stream.nfd)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},read(stream,buffer,offset,length,position){try{return stream.node.mount.opts.fs.read(stream.nfd,buffer,offset,length,position)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},write(stream,buffer,offset,length,position){try{return stream.node.mount.opts.fs.write(stream.nfd,buffer,offset,length,position)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=stream.node.node_ops.getattr(stream.node);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position}}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:class{constructor(errno){this.name="ErrnoError";this.errno=errno}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.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{constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev;this.readMode=292|73;this.writeMode=146}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={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;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}else if(perms.includes("w")&&!(node.mode&146)){return 2}else 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){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}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},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},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)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},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:type,opts:opts,mountpoint: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);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];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||name==="."||name===".."){throw new FS.ErrnoError(28)}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)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;iFS.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});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){randomLeft=randomFill(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",16384|511,73);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}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}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(){[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""});FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS:MEMFS,PROXYFS:PROXYFS}},init(input,output,error){FS.init.initialized=true;Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;_fflush(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))throw new Error("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)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("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))throw new Error("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")throw new Error("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(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"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: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={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];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:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};Module["FS"]=FS;var SOCKFS={mount(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("function"===typeof Module["websocket"]["url"]) { -url = Module["websocket"]["url"](...arguments); -}else if ("string" === typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;{WebSocketConstructor=WebSocket}if (Module['websocket']['decorator']) {WebSocketConstructor = Module['websocket']['decorator'](WebSocketConstructor);}ws = new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer(sock,addr,port){return sock.peers[addr+":"+port]},addPeer(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}data=new Uint8Array(data)}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return 28}},close(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i{var socket=SOCKFS.getSocket(fd);if(!socket)throw new FS.ErrnoError(8);return socket};var inetPton4=str=>{var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0};var jstoi_q=str=>parseInt(str);var inetPton6=str=>{var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w{switch(family){case 2:addr=inetPton4(addr);zeroMemory(sa,16);if(addrlen){HEAP32[addrlen>>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);break;default:return 5}return 0};var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};function ___syscall_accept4(fd,addr,addrlen,flags,d1,d2){try{var sock=getSocketFromFD(fd);var newsock=sock.sock_ops.accept(sock);if(addr){var errno=writeSockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport,addrlen)}return newsock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var inetNtop4=addr=>(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255);var inetNtop6=ints=>{var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word{var family=HEAP16[sa>>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}};var getSocketAddress=(addrp,addrlen,allowNull)=>{if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info};function ___syscall_bind(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var SYSCALLS={DEFAULT_POLLMASK:5,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 PATH.join2(dir,path)},doStat(func,path,buf){var stat=func(path);HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1];HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAPU32[buf+48>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];return 0},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}};function ___syscall_chdir(path){try{path=SYSCALLS.getStr(path);FS.chdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_connect(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.connect(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_dup(fd){try{var old=SYSCALLS.getStreamFromFD(fd);return FS.dupStream(old).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_dup3(fd,newfd,flags){try{var old=SYSCALLS.getStreamFromFD(fd);if(old.fd===newfd)return-28;var existing=FS.getStream(newfd);if(existing)FS.close(existing);return FS.dupStream(old,newfd).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_faccessat(dirfd,path,amode,flags){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}}var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function ___syscall_fallocate(fd,mode,offset_low,offset_high,len_low,len_high){var offset=convertI32PairToI53Checked(offset_low,offset_high);var len=convertI32PairToI53Checked(len_low,len_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.allocate(stream,offset,len);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fchmod(fd,mode){try{FS.fchmod(fd,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fchown32(fd,owner,group){try{FS.fchown(fd,owner,group);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fchownat(dirfd,path,owner,group,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;flags=flags&~256;path=SYSCALLS.calculateAt(dirfd,path);(nofollow?FS.lchown:FS.chown)(path,owner,group);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function syscallGetVarargI(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret}var syscallGetVarargP=syscallGetVarargI;function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();stream.flags|=arg;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fdatasync(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ftruncate64(fd,length_low,length_high){var length=convertI32PairToI53Checked(length_low,length_high);try{if(isNaN(length))return 61;FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);Module["stringToUTF8"]=stringToUTF8;function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>2]=tempI64[0],HEAP32[dirp+pos+4>>2]=tempI64[1];tempI64=[(idx+1)*struct_size>>>0,(tempDouble=(idx+1)*struct_size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos+8>>2]=tempI64[0],HEAP32[dirp+pos+12>>2]=tempI64[1];HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_getpeername(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);if(!sock.daddr){return-53}var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.daddr),sock.dport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_getsockname(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.saddr||"0.0.0.0"),sock.sport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_getsockopt(fd,level,optname,optval,optlen,d1){try{var sock=getSocketFromFD(fd);if(level===1){if(optname===4){HEAP32[optval>>2]=sock.error;HEAP32[optlen>>2]=4;sock.error=null;return 0}}return-50}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){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]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17]=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];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag:c_iflag,c_oflag:c_oflag,c_cflag:c_cflag,c_lflag:c_lflag,c_cc:c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}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]=winsize[0];HEAP16[argp+2>>1]=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_listen(fd,backlog){try{var sock=getSocketFromFD(fd);sock.sock_ops.listen(sock,backlog);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~6400;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){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 PIPEFS={BUCKET_BUFFER_SIZE:8192,mount(mount){return FS.createNode(null,"/",16384|511,0)},createPipe(){var pipe={buckets:[],refcnt:2};pipe.buckets.push({buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:0,roffset:0});var rName=PIPEFS.nextname();var wName=PIPEFS.nextname();var rNode=FS.createNode(PIPEFS.root,rName,4096,0);var wNode=FS.createNode(PIPEFS.root,wName,4096,0);rNode.pipe=pipe;wNode.pipe=pipe;var readableStream=FS.createStream({path:rName,node:rNode,flags:0,seekable:false,stream_ops:PIPEFS.stream_ops});rNode.stream=readableStream;var writableStream=FS.createStream({path:wName,node:wNode,flags:1,seekable:false,stream_ops:PIPEFS.stream_ops});wNode.stream=writableStream;return{readable_fd:readableStream.fd,writable_fd:writableStream.fd}},stream_ops:{poll(stream){var pipe=stream.node.pipe;if((stream.flags&2097155)===1){return 256|4}if(pipe.buckets.length>0){for(var i=0;i0){return 64|1}}}return 0},ioctl(stream,request,varargs){return 28},fsync(stream){return 28},read(stream,buffer,offset,length,position){var pipe=stream.node.pipe;var currentLength=0;for(var i=0;i=dataLen){currBucket.buffer.set(data,currBucket.offset);currBucket.offset+=dataLen;return dataLen}else if(freeBytesInCurrBuffer>0){currBucket.buffer.set(data.subarray(0,freeBytesInCurrBuffer),currBucket.offset);currBucket.offset+=freeBytesInCurrBuffer;data=data.subarray(freeBytesInCurrBuffer,data.byteLength)}var numBuckets=data.byteLength/PIPEFS.BUCKET_BUFFER_SIZE|0;var remElements=data.byteLength%PIPEFS.BUCKET_BUFFER_SIZE;for(var i=0;i0){var newBucket={buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:data.byteLength,roffset:0};pipe.buckets.push(newBucket);newBucket.buffer.set(data)}return dataLen},close(stream){var pipe=stream.node.pipe;pipe.refcnt--;if(pipe.refcnt===0){pipe.buckets=null}}},nextname(){if(!PIPEFS.nextname.current){PIPEFS.nextname.current=0}return"pipe["+PIPEFS.nextname.current+++"]"}};function ___syscall_pipe(fdPtr){try{if(fdPtr==0){throw new FS.ErrnoError(21)}var res=PIPEFS.createPipe();HEAP32[fdPtr>>2]=res.readable_fd;HEAP32[fdPtr+4>>2]=res.writable_fd;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_poll(fds,nfds,timeout){try{var nonzero=0;for(var i=0;i>2];var events=HEAP16[pollfd+4>>1];var mask=32;var stream=FS.getStream(fd);if(stream){mask=SYSCALLS.DEFAULT_POLLMASK;if (stream.stream_ops?.poll){mask=stream.stream_ops.poll(stream,-1)}}mask&=events|8|16;if(mask)nonzero++;HEAP16[pollfd+6>>1]=mask}return nonzero}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_recvfrom(fd,buf,len,flags,addr,addrlen){try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_sendto(fd,message,length,flags,addr,addr_len){try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_statfs64(path,size,buf){try{path=SYSCALLS.getStr(path);HEAP32[buf+4>>2]=4096;HEAP32[buf+40>>2]=4096;HEAP32[buf+8>>2]=1e6;HEAP32[buf+12>>2]=5e5;HEAP32[buf+16>>2]=5e5;HEAP32[buf+20>>2]=FS.nextInode;HEAP32[buf+24>>2]=1e6;HEAP32[buf+28>>2]=42;HEAP32[buf+44>>2]=2;HEAP32[buf+36>>2]=255;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_symlink(target,linkpath){try{target=SYSCALLS.getStr(target);linkpath=SYSCALLS.getStr(linkpath);FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var readI53FromI64=ptr=>HEAPU32[ptr>>2]+HEAP32[ptr+4>>2]*4294967296;function ___syscall_utimensat(dirfd,path,times,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path,true);if(!times){var atime=Date.now();var mtime=atime}else{var seconds=readI53FromI64(times);var nanoseconds=HEAP32[times+8>>2];atime=seconds*1e3+nanoseconds/(1e3*1e3);times+=16;seconds=readI53FromI64(times);nanoseconds=HEAP32[times+8>>2];mtime=seconds*1e3+nanoseconds/(1e3*1e3)}FS.utime(path,atime,mtime);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>{abort("")};var nowIsMonotonic=1;var __emscripten_get_now_is_monotonic=()=>nowIsMonotonic;var __emscripten_lookup_name=name=>{var nameString=UTF8ToString(name);return inetPton4(DNS.lookup_name(nameString))};var __emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};function __gmtime_js(time_low,time_high,tmPtr){var time=convertI32PairToI53Checked(time_low,time_high);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday}var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time_low,time_high,tmPtr){var time=convertI32PairToI53Checked(time_low,time_high);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}var setTempRet0=val=>__emscripten_tempret_set(val);var __mktime_js=function(tmPtr){var ret=(()=>{var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>2]=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getYear();var timeMs=date.getTime();if(isNaN(timeMs)){return-1}return timeMs/1e3})();return setTempRet0((tempDouble=ret,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)),ret>>>0};function __mmap_js(len,prot,flags,fd,offset_low,offset_high,allocated,addr){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>2]=res.allocated;HEAPU32[addr>>2]=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_low,offset_high){var offset=convertI32PairToI53Checked(offset_low,offset_high);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 runtimeKeepaliveCounter=0;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;if(!keepRuntimeAlive()){exitRuntime()}_proc_exit(status)};var _exit=exitJS;Module["_exit"]=_exit;var maybeExit=()=>{if(runtimeExited){return}if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(runtimeExited||ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now;_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:id,timeout_ms:timeout_ms};return 0};var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=date=>date.toLocaleTimeString(undefined,{hour12:false,timeZoneName:"short"}).split(" ")[1];var winterName=extractZone(winter);var summerName=extractZone(summer);if(summerOffsetDate.now();var getHeapMax=()=>2147483648;var _emscripten_get_heap_max=()=>getHeapMax();var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;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,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var runtimeKeepalivePush=()=>{runtimeKeepaliveCounter+=1};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var safeSetTimeout=(func,timeout)=>{runtimeKeepalivePush();return setTimeout(()=>{runtimeKeepalivePop();callUserCallback(func)},timeout)};var _emscripten_sleep=ms=>Asyncify.handleSleep(wakeUp=>safeSetTimeout(wakeUp,ms));Module["_emscripten_sleep"]=_emscripten_sleep;_emscripten_sleep.isAsync=true;var ENV = PHPLoader.ENV || {};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"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};var stringToAscii=(str,buffer)=>{for(var i=0;i{var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>2]=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}}function _fd_fdstat_get(fd,pbuf){try{var rightsBase=0;var rightsInheriting=0;var flags=0;{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4}HEAP8[pbuf]=type;HEAP16[pbuf+2>>1]=flags;tempI64=[rightsBase>>>0,(tempDouble=rightsBase,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[pbuf+8>>2]=tempI64[0],HEAP32[pbuf+12>>2]=tempI64[1];tempI64=[rightsInheriting>>>0,(tempDouble=rightsInheriting,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[pbuf+16>>2]=tempI64[0],HEAP32[pbuf+20>>2]=tempI64[1];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];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];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];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var _getaddrinfo=(node,service,hint,out)=>{var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var errno;salen=family===10?28:16;addr=family===10?inetNtop6(addr):inetNtop4(addr);sa=_malloc(salen);errno=writeSockaddr(sa,family,addr,port);assert(!errno);ai=_malloc(32);HEAP32[ai+4>>2]=family;HEAP32[ai+8>>2]=type;HEAP32[ai+12>>2]=proto;HEAPU32[ai+24>>2]=canon;HEAPU32[ai+20>>2]=sa;if(family===10){HEAP32[ai+16>>2]=28}else{HEAP32[ai+16>>2]=16}HEAP32[ai+28>>2]=0;return ai}if(hint){flags=HEAP32[hint>>2];family=HEAP32[hint+4>>2];type=HEAP32[hint+8>>2];proto=HEAP32[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}node=UTF8ToString(node);addr=inetPton4(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=inetPton6(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAPU32[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=inetPton4(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0};var _getnameinfo=(sa,salen,node,nodelen,serv,servlen,flags)=>{var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0};var Protocols={list:[],map:{}};var _setprotoent=stayopen=>{function allocprotoent(name,proto,aliases){var nameBuf=_malloc(name.length+1);stringToAscii(name,nameBuf);var j=0;var length=aliases.length;var aliasListBuf=_malloc((length+1)*4);for(var i=0;i>2]=aliasBuf}HEAPU32[aliasListBuf+j>>2]=0;var pe=_malloc(12);HEAPU32[pe>>2]=nameBuf;HEAPU32[pe+4>>2]=aliasListBuf;HEAP32[pe+8>>2]=proto;return pe}var list=Protocols.list;var map=Protocols.map;if(list.length===0){var entry=allocprotoent("tcp",6,["TCP"]);list.push(entry);map["tcp"]=map["6"]=entry;entry=allocprotoent("udp",17,["UDP"]);list.push(entry);map["udp"]=map["17"]=entry}_setprotoent.index=0};var _getprotobyname=name=>{name=UTF8ToString(name);_setprotoent(true);var result=Protocols.map[name];return result};var _getprotobynumber=number=>{_setprotoent(true);var result=Protocols.map[number];return result};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 allocateUTF8OnStack=stringToUTF8OnStack;var PHPWASM={init:function(){FS.mkdir("/internal");FS.mkdir("/internal/shared");FS.mkdir("/internal/shared/preload");PHPWASM.EventEmitter=ENVIRONMENT_IS_NODE?require("events").EventEmitter:class EventEmitter{constructor(){this.listeners={}}emit(eventName,data){if(this.listeners[eventName]){this.listeners[eventName].forEach(callback=>{callback(data)})}}once(eventName,callback){const self=this;function removedCallback(){callback(...arguments);self.removeListener(eventName,removedCallback)}this.on(eventName,removedCallback)}removeAllListeners(eventName){if(eventName){delete this.listeners[eventName]}else{this.listeners={}}}removeListener(eventName,callback){if(this.listeners[eventName]){const idx=this.listeners[eventName].indexOf(callback);if(idx!==-1){this.listeners[eventName].splice(idx,1)}}}};PHPWASM.child_proc_by_fd={};PHPWASM.child_proc_by_pid={};PHPWASM.input_devices={}},getAllWebSockets:function(sock){const webSockets=new Set;if(sock.server){sock.server.clients.forEach(ws=>{webSockets.add(ws)})}for(const peer of PHPWASM.getAllPeers(sock)){webSockets.add(peer.socket)}return Array.from(webSockets)},getAllPeers:function(sock){const peers=new Set;if(sock.server){sock.pending.filter(pending=>pending.peers).forEach(pending=>{for(const peer of Object.values(pending.peers)){peers.add(peer)}})}if(sock.peers){for(const peer of Object.values(sock.peers)){peers.add(peer)}}return Array.from(peers)},awaitData:function(ws){return PHPWASM.awaitEvent(ws,"message")},awaitConnection:function(ws){if(ws.OPEN===ws.readyState){return[Promise.resolve(),PHPWASM.noop]}return PHPWASM.awaitEvent(ws,"open")},awaitClose:function(ws){if([ws.CLOSING,ws.CLOSED].includes(ws.readyState)){return[Promise.resolve(),PHPWASM.noop]}return PHPWASM.awaitEvent(ws,"close")},awaitError:function(ws){if([ws.CLOSING,ws.CLOSED].includes(ws.readyState)){return[Promise.resolve(),PHPWASM.noop]}return PHPWASM.awaitEvent(ws,"error")},awaitEvent:function(ws,event){let resolve;const listener=()=>{resolve()};const promise=new Promise(function(_resolve){resolve=_resolve;ws.once(event,listener)});const cancel=()=>{ws.removeListener(event,listener);setTimeout(resolve)};return[promise,cancel]},noop:function(){},spawnProcess:function(command,args,options){if(Module["spawnProcess"]){const spawnedPromise=Module["spawnProcess"](command,args,options);return Promise.resolve(spawnedPromise).then(function(spawned){if(!spawned||!spawned.on){throw new Error("spawnProcess() must return an EventEmitter but returned a different type.")}return spawned})}if(ENVIRONMENT_IS_NODE){return require("child_process").spawn(command,args,{...options,shell:true,stdio:["pipe","pipe","pipe"],timeout:100})}const e=new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() "+"and provide a callback to handle spawning processes, or disable a popen(), proc_open() "+"and similar functions via php.ini.");e.code="SPAWN_UNSUPPORTED";throw e},shutdownSocket:function(socketd,how){const sock=getSocketFromFD(socketd);const peer=Object.values(sock.peers)[0];if(!peer){return-1}try{peer.socket.close();SOCKFS.websocket_sock_ops.removePeer(sock,peer);return 0}catch(e){console.log("Socket shutdown error",e);return-1}}};function _js_create_input_device(deviceId){let dataBuffer=[];let dataCallback;const filename="proc_id_"+deviceId;const device=FS.createDevice("/dev",filename,function(){},function(byte){try{dataBuffer.push(byte);if(dataCallback){dataCallback(new Uint8Array(dataBuffer));dataBuffer=[]}}catch(e){console.error(e);throw e}});const devicePath="/dev/"+filename;PHPWASM.input_devices[deviceId]={devicePath:devicePath,onData:function(cb){dataCallback=cb;dataBuffer.forEach(function(data){cb(data)});dataBuffer.length=0}};return allocateUTF8OnStack(devicePath)}function _js_open_process(command,argsPtr,argsLength,descriptorsPtr,descriptorsLength,cwdPtr,cwdLength,envPtr,envLength){if(!command){return 1}const cmdstr=UTF8ToString(command);if(!cmdstr.length){return 0}let argsArray=[];if(argsLength){for(var i=0;i>2]))}}const cwdstr=cwdPtr?UTF8ToString(cwdPtr):null;let envObject=null;if(envLength){envObject={};for(var i=0;i>2]);const splitAt=envEntry.indexOf("=");if(splitAt===-1){continue}const key=envEntry.substring(0,splitAt);const value=envEntry.substring(splitAt+1);envObject[key]=value}}var std={};for(var i=0;i>2];std[HEAPU32[descriptorPtr>>2]]={child:HEAPU32[descriptorPtr+4>>2],parent:HEAPU32[descriptorPtr+8>>2]}}return Asyncify.handleSleep(async wakeUp=>{let cp;try{const options={};if(cwdstr!==null){options.cwd=cwdstr}if(envObject!==null){options.env=envObject}cp=PHPWASM.spawnProcess(cmdstr,argsArray,options);if(cp instanceof Promise){cp=await cp}}catch(e){if(e.code==="SPAWN_UNSUPPORTED"){wakeUp(1);return}console.error(e);wakeUp(1);throw e}const ProcInfo={pid:cp.pid,exited:false,stdinFd:std[0]?.child,stdinIsDevice:std[0]?.child in PHPWASM.input_devices,stdoutChildFd:std[1]?.child,stdoutParentFd:std[1]?.parent,stderrChildFd:std[2]?.child,stderrParentFd:std[2]?.parent,stdout:new PHPWASM.EventEmitter,stderr:new PHPWASM.EventEmitter};if(ProcInfo.stdoutChildFd)PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd]=ProcInfo;if(ProcInfo.stderrChildFd)PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd]=ProcInfo;if(ProcInfo.stdoutParentFd)PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd]=ProcInfo;if(ProcInfo.stderrParentFd)PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd]=ProcInfo;PHPWASM.child_proc_by_pid[ProcInfo.pid]=ProcInfo;cp.on("exit",function(code){ProcInfo.exitCode=code;ProcInfo.exited=true;ProcInfo.stdout.emit("data");ProcInfo.stderr.emit("data")});if(ProcInfo.stdoutChildFd){const stdoutStream=SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd);let stdoutAt=0;cp.stdout.on("data",function(data){ProcInfo.stdout.emit("data",data);stdoutStream.stream_ops.write(stdoutStream,data,0,data.length,stdoutAt);stdoutAt+=data.length})}if(ProcInfo.stderrChildFd){const stderrStream=SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd);let stderrAt=0;cp.stderr.on("data",function(data){ProcInfo.stderr.emit("data",data);stderrStream.stream_ops.write(stderrStream,data,0,data.length,stderrAt);stderrAt+=data.length})}try{await new Promise((resolve,reject)=>{cp.on("spawn",resolve);cp.on("error",reject)})}catch(e){console.error(e);wakeUp(1);return}if(ProcInfo.stdinIsDevice){PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data){if(!data)return;if(typeof data==="number"){data=new Uint8Array([data])}const dataStr=new TextDecoder("utf-8").decode(data);cp.stdin.write(dataStr)});wakeUp(ProcInfo.pid);return}if(ProcInfo.stdinFd){const stdinStream=SYSCALLS.getStreamFromFD(ProcInfo.stdinFd);if(stdinStream.node){const CHUNK_SIZE=1024;const buffer=new Uint8Array(CHUNK_SIZE);let offset=0;while(true){const bytesRead=stdinStream.stream_ops.read(stdinStream,buffer,0,CHUNK_SIZE,offset);if(bytesRead===null||bytesRead===0){break}try{cp.stdin.write(buffer.subarray(0,bytesRead))}catch(e){console.error(e);return 1}if(bytesRead>2]=PHPWASM.child_proc_by_pid[pid].exitCode;return 1}return 0}function _js_waitpid(pid,exitCodePtr){if(!PHPWASM.child_proc_by_pid[pid]){return-1}return Asyncify.handleSleep(wakeUp=>{const poll=function(){if(PHPWASM.child_proc_by_pid[pid]?.exited){HEAPU32[exitCodePtr>>2]=PHPWASM.child_proc_by_pid[pid].exitCode;wakeUp(pid)}else{setTimeout(poll,50)}};poll()})}var arraySum=(array,index)=>{var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum};var MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];var addDays=(date,days)=>{var newDate=new Date(date.getTime());while(days>0){var leap=isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var _strftime=(s,maxsize,format,tm)=>{var tm_zone=HEAPU32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":date=>WEEKDAYS[date.tm_wday].substring(0,3),"%A":date=>WEEKDAYS[date.tm_wday],"%b":date=>MONTHS[date.tm_mon].substring(0,3),"%B":date=>MONTHS[date.tm_mon],"%C":date=>{var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":date=>leadingNulls(date.tm_mday,2),"%e":date=>leadingSomething(date.tm_mday,2," "),"%g":date=>getWeekBasedYear(date).toString().substring(2),"%G":getWeekBasedYear,"%H":date=>leadingNulls(date.tm_hour,2),"%I":date=>{var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":date=>leadingNulls(date.tm_mday+arraySum(isLeapYear(date.tm_year+1900)?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR,date.tm_mon-1),3),"%m":date=>leadingNulls(date.tm_mon+1,2),"%M":date=>leadingNulls(date.tm_min,2),"%n":()=>"\n","%p":date=>{if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":date=>leadingNulls(date.tm_sec,2),"%t":()=>"\t","%u":date=>date.tm_wday||7,"%U":date=>{var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":date=>{var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":date=>date.tm_wday,"%W":date=>{var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":date=>(date.tm_year+1900).toString().substring(2),"%Y":date=>date.tm_year+1900,"%z":date=>{var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":date=>date.tm_zone,"%%":()=>"%"};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1};var _strftime_l=(s,maxsize,format,tm,loc)=>_strftime(s,maxsize,format,tm);var _strptime=(buf,format,tm)=>{var pattern=UTF8ToString(format);var SPECIAL_CHARS="\\!@#$^&*()+=-[]/{}|:<>?,.";for(var i=0,ii=SPECIAL_CHARS.length;iEQUIVALENT_MATCHERS[c]||m).replace(/%(.)/g,(_,c)=>{let pat=DATE_PATTERNS[c];if(pat){capture.push(c);return`(${pat})`}else{return c}}).replace(/\s+/g,"\\s*");var matches=new RegExp("^"+pattern_out,"i").exec(UTF8ToString(buf));function initDate(){function fixup(value,min,max){return typeof value!="number"||isNaN(value)?min:value>=min?value<=max?value:max:min}return{year:fixup(HEAP32[tm+20>>2]+1900,1970,9999),month:fixup(HEAP32[tm+16>>2],0,11),day:fixup(HEAP32[tm+12>>2],1,31),hour:fixup(HEAP32[tm+8>>2],0,23),min:fixup(HEAP32[tm+4>>2],0,59),sec:fixup(HEAP32[tm>>2],0,59),gmtoff:0}}if(matches){var date=initDate();var value;var getMatch=symbol=>{var pos=capture.indexOf(symbol);if(pos>=0){return matches[pos+1]}return};if(value=getMatch("S")){date.sec=jstoi_q(value)}if(value=getMatch("M")){date.min=jstoi_q(value)}if(value=getMatch("H")){date.hour=jstoi_q(value)}else if(value=getMatch("I")){var hour=jstoi_q(value);if(value=getMatch("p")){hour+=value.toUpperCase()[0]==="P"?12:0}date.hour=hour}if(value=getMatch("Y")){date.year=jstoi_q(value)}else if(value=getMatch("y")){var year=jstoi_q(value);if(value=getMatch("C")){year+=jstoi_q(value)*100}else{year+=year<69?2e3:1900}date.year=year}if(value=getMatch("m")){date.month=jstoi_q(value)-1}else if(value=getMatch("b")){date.month=MONTH_NUMBERS[value.substring(0,3).toUpperCase()]||0}if(value=getMatch("d")){date.day=jstoi_q(value)}else if(value=getMatch("j")){var day=jstoi_q(value);var leapYear=isLeapYear(date.year);for(var month=0;month<12;++month){var daysUntilMonth=arraySum(leapYear?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR,month-1);if(day<=daysUntilMonth+(leapYear?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR)[month]){date.day=day-daysUntilMonth}}}else if(value=getMatch("a")){var weekDay=value.substring(0,3).toUpperCase();if(value=getMatch("U")){var weekDayNumber=DAY_NUMBERS_SUN_FIRST[weekDay];var weekNumber=jstoi_q(value);var janFirst=new Date(date.year,0,1);var endDate;if(janFirst.getDay()===0){endDate=addDays(janFirst,weekDayNumber+7*(weekNumber-1))}else{endDate=addDays(janFirst,7-janFirst.getDay()+weekDayNumber+7*(weekNumber-1))}date.day=endDate.getDate();date.month=endDate.getMonth()}else if(value=getMatch("W")){var weekDayNumber=DAY_NUMBERS_MON_FIRST[weekDay];var weekNumber=jstoi_q(value);var janFirst=new Date(date.year,0,1);var endDate;if(janFirst.getDay()===1){endDate=addDays(janFirst,weekDayNumber+7*(weekNumber-1))}else{endDate=addDays(janFirst,7-janFirst.getDay()+1+weekDayNumber+7*(weekNumber-1))}date.day=endDate.getDate();date.month=endDate.getMonth()}}if(value=getMatch("z")){if(value.toLowerCase()==="z"){date.gmtoff=0}else{var match=value.match(/^((?:\-|\+)\d\d):?(\d\d)?/);date.gmtoff=match[1]*3600;if(match[2]){date.gmtoff+=date.gmtoff>0?match[2]*60:-match[2]*60}}}var fullDate=new Date(date.year,date.month,date.day,date.hour,date.min,date.sec,0);HEAP32[tm>>2]=fullDate.getSeconds();HEAP32[tm+4>>2]=fullDate.getMinutes();HEAP32[tm+8>>2]=fullDate.getHours();HEAP32[tm+12>>2]=fullDate.getDate();HEAP32[tm+16>>2]=fullDate.getMonth();HEAP32[tm+20>>2]=fullDate.getFullYear()-1900;HEAP32[tm+24>>2]=fullDate.getDay();HEAP32[tm+28>>2]=arraySum(isLeapYear(fullDate.getFullYear())?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR,fullDate.getMonth()-1)+fullDate.getDate()-1;HEAP32[tm+32>>2]=0;HEAP32[tm+36>>2]=date.gmtoff;return buf+intArrayFromString(matches[0]).length-1}return 0};function _wasm_setsockopt(socketd,level,optionName,optionValuePtr,optionLen){const optionValue=HEAPU8[optionValuePtr];const SOL_SOCKET=1;const SO_KEEPALIVE=9;const IPPROTO_TCP=6;const TCP_NODELAY=1;const isSupported=level===SOL_SOCKET&&optionName===SO_KEEPALIVE||level===IPPROTO_TCP&&optionName===TCP_NODELAY;if(!isSupported){console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`);return-1}const ws=PHPWASM.getAllWebSockets(socketd)[0];if(!ws){return-1}ws.setSocketOpt(level,optionName,optionValuePtr);return 0}var Asyncify={instrumentWasmImports(imports){var importPattern=/^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/;for(let[x,original]of Object.entries(imports)){if(typeof original=="function"){let isAsyncifyImport=original.isAsync||importPattern.test(x);if(isAsyncifyImport){imports[x]=original=new WebAssembly.Suspending(original)}}}},instrumentWasmExports(exports){var exportPattern=/^(wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/;Asyncify.asyncExports=new Set;var ret={};for(let[x,original]of Object.entries(exports)){if(typeof original=="function"){let isAsyncifyExport=exportPattern.test(x);if(isAsyncifyExport){Asyncify.asyncExports.add(original);original=Asyncify.makeAsyncFunction(original)}ret[x]=(...args)=>original(...args)}else{ret[x]=original}}return ret},asyncExports:null,isAsyncExport(func){return Asyncify.asyncExports?.has(func)},handleAsync:async startAsync=>{runtimeKeepalivePush();try{return await startAsync()}finally{runtimeKeepalivePop()}},handleSleep(startAsync){return Asyncify.handleAsync(()=>new Promise(startAsync))},makeAsyncFunction(original){return WebAssembly.promising(original)}};var getCFunc=ident=>{var func=Module["_"+ident];return func};var stackSave=()=>_emscripten_stack_get_current();var stackRestore=val=>__emscripten_stack_restore(val);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==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;iFS.unlink(path);var FS_createLazyFile=FS.createLazyFile;var FS_createDevice=FS.createDevice;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;PHPWASM.init();var wasmImports={SharpYuvConvert:_SharpYuvConvert,SharpYuvGetConversionMatrix:_SharpYuvGetConversionMatrix,SharpYuvInit:_SharpYuvInit,__assert_fail:___assert_fail,__asyncjs__js_fd_read:__asyncjs__js_fd_read,__asyncjs__js_module_onMessage:__asyncjs__js_module_onMessage,__asyncjs__js_popen_to_file:__asyncjs__js_popen_to_file,__asyncjs__wasm_poll_socket:__asyncjs__wasm_poll_socket,__call_sighandler:___call_sighandler,__syscall_accept4:___syscall_accept4,__syscall_bind:___syscall_bind,__syscall_chdir:___syscall_chdir,__syscall_chmod:___syscall_chmod,__syscall_connect:___syscall_connect,__syscall_dup:___syscall_dup,__syscall_dup3:___syscall_dup3,__syscall_faccessat:___syscall_faccessat,__syscall_fallocate:___syscall_fallocate,__syscall_fchmod:___syscall_fchmod,__syscall_fchown32:___syscall_fchown32,__syscall_fchownat:___syscall_fchownat,__syscall_fcntl64:___syscall_fcntl64,__syscall_fdatasync:___syscall_fdatasync,__syscall_fstat64:___syscall_fstat64,__syscall_ftruncate64:___syscall_ftruncate64,__syscall_getcwd:___syscall_getcwd,__syscall_getdents64:___syscall_getdents64,__syscall_getpeername:___syscall_getpeername,__syscall_getsockname:___syscall_getsockname,__syscall_getsockopt:___syscall_getsockopt,__syscall_ioctl:___syscall_ioctl,__syscall_listen:___syscall_listen,__syscall_lstat64:___syscall_lstat64,__syscall_mkdirat:___syscall_mkdirat,__syscall_newfstatat:___syscall_newfstatat,__syscall_openat:___syscall_openat,__syscall_pipe:___syscall_pipe,__syscall_poll:___syscall_poll,__syscall_readlinkat:___syscall_readlinkat,__syscall_recvfrom:___syscall_recvfrom,__syscall_renameat:___syscall_renameat,__syscall_rmdir:___syscall_rmdir,__syscall_sendto:___syscall_sendto,__syscall_socket:___syscall_socket,__syscall_stat64:___syscall_stat64,__syscall_statfs64:___syscall_statfs64,__syscall_symlink:___syscall_symlink,__syscall_unlinkat:___syscall_unlinkat,__syscall_utimensat:___syscall_utimensat,_abort_js:__abort_js,_emscripten_get_now_is_monotonic:__emscripten_get_now_is_monotonic,_emscripten_lookup_name:__emscripten_lookup_name,_emscripten_memcpy_js:__emscripten_memcpy_js,_emscripten_runtime_keepalive_clear:__emscripten_runtime_keepalive_clear,_gmtime_js:__gmtime_js,_localtime_js:__localtime_js,_mktime_js:__mktime_js,_mmap_js:__mmap_js,_munmap_js:__munmap_js,_setitimer_js:__setitimer_js,_tzset_js:__tzset_js,emscripten_date_now:_emscripten_date_now,emscripten_get_heap_max:_emscripten_get_heap_max,emscripten_get_now:_emscripten_get_now,emscripten_resize_heap:_emscripten_resize_heap,emscripten_sleep:_emscripten_sleep,environ_get:_environ_get,environ_sizes_get:_environ_sizes_get,exit:_exit,fd_close:_fd_close,fd_fdstat_get:_fd_fdstat_get,fd_read:_fd_read,fd_seek:_fd_seek,fd_write:_fd_write,getaddrinfo:_getaddrinfo,getnameinfo:_getnameinfo,getprotobyname:_getprotobyname,getprotobynumber:_getprotobynumber,js_create_input_device:_js_create_input_device,js_open_process:_js_open_process,js_process_status:_js_process_status,js_waitpid:_js_waitpid,proc_exit:_proc_exit,strftime:_strftime,strftime_l:_strftime_l,strptime:_strptime,wasm_setsockopt:_wasm_setsockopt};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["__wasm_call_ctors"])();var _malloc=a0=>(_malloc=wasmExports["malloc"])(a0);var _wasm_read=Module["_wasm_read"]=(a0,a1,a2)=>(_wasm_read=Module["_wasm_read"]=wasmExports["wasm_read"])(a0,a1,a2);var _fflush=a0=>(_fflush=wasmExports["fflush"])(a0);var _wasm_popen=Module["_wasm_popen"]=(a0,a1)=>(_wasm_popen=Module["_wasm_popen"]=wasmExports["wasm_popen"])(a0,a1);var _wasm_php_exec=Module["_wasm_php_exec"]=(a0,a1,a2,a3)=>(_wasm_php_exec=Module["_wasm_php_exec"]=wasmExports["wasm_php_exec"])(a0,a1,a2,a3);var _php_pollfd_for=Module["_php_pollfd_for"]=(a0,a1,a2)=>(_php_pollfd_for=Module["_php_pollfd_for"]=wasmExports["php_pollfd_for"])(a0,a1,a2);var _htons=a0=>(_htons=wasmExports["htons"])(a0);var _ntohs=a0=>(_ntohs=wasmExports["ntohs"])(a0);var _htonl=a0=>(_htonl=wasmExports["htonl"])(a0);var _wasm_sleep=Module["_wasm_sleep"]=a0=>(_wasm_sleep=Module["_wasm_sleep"]=wasmExports["wasm_sleep"])(a0);var ___wrap_select=Module["___wrap_select"]=(a0,a1,a2,a3,a4)=>(___wrap_select=Module["___wrap_select"]=wasmExports["__wrap_select"])(a0,a1,a2,a3,a4);var _wasm_set_sapi_name=Module["_wasm_set_sapi_name"]=a0=>(_wasm_set_sapi_name=Module["_wasm_set_sapi_name"]=wasmExports["wasm_set_sapi_name"])(a0);var _wasm_set_phpini_path=Module["_wasm_set_phpini_path"]=a0=>(_wasm_set_phpini_path=Module["_wasm_set_phpini_path"]=wasmExports["wasm_set_phpini_path"])(a0);var _wasm_add_SERVER_entry=Module["_wasm_add_SERVER_entry"]=(a0,a1)=>(_wasm_add_SERVER_entry=Module["_wasm_add_SERVER_entry"]=wasmExports["wasm_add_SERVER_entry"])(a0,a1);var _wasm_add_ENV_entry=Module["_wasm_add_ENV_entry"]=(a0,a1)=>(_wasm_add_ENV_entry=Module["_wasm_add_ENV_entry"]=wasmExports["wasm_add_ENV_entry"])(a0,a1);var _wasm_set_query_string=Module["_wasm_set_query_string"]=a0=>(_wasm_set_query_string=Module["_wasm_set_query_string"]=wasmExports["wasm_set_query_string"])(a0);var _wasm_set_path_translated=Module["_wasm_set_path_translated"]=a0=>(_wasm_set_path_translated=Module["_wasm_set_path_translated"]=wasmExports["wasm_set_path_translated"])(a0);var _wasm_set_skip_shebang=Module["_wasm_set_skip_shebang"]=a0=>(_wasm_set_skip_shebang=Module["_wasm_set_skip_shebang"]=wasmExports["wasm_set_skip_shebang"])(a0);var _wasm_set_request_uri=Module["_wasm_set_request_uri"]=a0=>(_wasm_set_request_uri=Module["_wasm_set_request_uri"]=wasmExports["wasm_set_request_uri"])(a0);var _wasm_set_request_method=Module["_wasm_set_request_method"]=a0=>(_wasm_set_request_method=Module["_wasm_set_request_method"]=wasmExports["wasm_set_request_method"])(a0);var _wasm_set_request_host=Module["_wasm_set_request_host"]=a0=>(_wasm_set_request_host=Module["_wasm_set_request_host"]=wasmExports["wasm_set_request_host"])(a0);var _wasm_set_content_type=Module["_wasm_set_content_type"]=a0=>(_wasm_set_content_type=Module["_wasm_set_content_type"]=wasmExports["wasm_set_content_type"])(a0);var _wasm_set_request_body=Module["_wasm_set_request_body"]=a0=>(_wasm_set_request_body=Module["_wasm_set_request_body"]=wasmExports["wasm_set_request_body"])(a0);var _wasm_set_content_length=Module["_wasm_set_content_length"]=a0=>(_wasm_set_content_length=Module["_wasm_set_content_length"]=wasmExports["wasm_set_content_length"])(a0);var _wasm_set_cookies=Module["_wasm_set_cookies"]=a0=>(_wasm_set_cookies=Module["_wasm_set_cookies"]=wasmExports["wasm_set_cookies"])(a0);var _wasm_set_request_port=Module["_wasm_set_request_port"]=a0=>(_wasm_set_request_port=Module["_wasm_set_request_port"]=wasmExports["wasm_set_request_port"])(a0);var _wasm_sapi_request_shutdown=Module["_wasm_sapi_request_shutdown"]=()=>(_wasm_sapi_request_shutdown=Module["_wasm_sapi_request_shutdown"]=wasmExports["wasm_sapi_request_shutdown"])();var _wasm_sapi_handle_request=Module["_wasm_sapi_handle_request"]=()=>(_wasm_sapi_handle_request=Module["_wasm_sapi_handle_request"]=wasmExports["wasm_sapi_handle_request"])();var _php_wasm_init=Module["_php_wasm_init"]=()=>(_php_wasm_init=Module["_php_wasm_init"]=wasmExports["php_wasm_init"])();var _wasm_free=Module["_wasm_free"]=a0=>(_wasm_free=Module["_wasm_free"]=wasmExports["wasm_free"])(a0);var ___funcs_on_exit=()=>(___funcs_on_exit=wasmExports["__funcs_on_exit"])();var _emscripten_builtin_memalign=(a0,a1)=>(_emscripten_builtin_memalign=wasmExports["emscripten_builtin_memalign"])(a0,a1);var __emscripten_timeout=(a0,a1)=>(__emscripten_timeout=wasmExports["_emscripten_timeout"])(a0,a1);var ___trap=()=>(___trap=wasmExports["__trap"])();var __emscripten_tempret_set=a0=>(__emscripten_tempret_set=wasmExports["_emscripten_tempret_set"])(a0);var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["_emscripten_stack_restore"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["_emscripten_stack_alloc"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["emscripten_stack_get_current"])();Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["wasmExports"]=wasmExports;Module["ccall"]=ccall;Module["FS_createPreloadedFile"]=FS_createPreloadedFile;Module["FS_unlink"]=FS_unlink;Module["FS_createPath"]=FS_createPath;Module["FS_createDevice"]=FS_createDevice;Module["FS_createDataFile"]=FS_createDataFile;Module["FS_createLazyFile"]=FS_createLazyFile;Module["PROXYFS"]=PROXYFS;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); +var Module=typeof PHPLoader!="undefined"?PHPLoader:{};var ENVIRONMENT_IS_WEB=RuntimeName==="WEB";var ENVIRONMENT_IS_WORKER=RuntimeName==="WORKER";var ENVIRONMENT_IS_NODE=RuntimeName==="NODE";var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{fetch(url,{credentials:"same-origin"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+" : "+response.url))}).then(onload,onerror)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function exitRuntime(){___funcs_on_exit();callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";if(runtimeInitialized){___trap()}var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);function findWasmBinary(){var f=dependencyFilename;if(!isDataURI(f)){return locateFile(f)}return f}var wasmBinaryFile;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"}function getBinaryPromise(binaryFile){if(!wasmBinary){return new Promise((resolve,reject)=>{readAsync(binaryFile,response=>resolve(new Uint8Array(response)),error=>{try{resolve(getBinarySync(binaryFile))}catch(e){reject(e)}})})}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){Asyncify.instrumentWasmImports(wasmImports);return{env:wasmImports,wasi_snapshot_preview1:wasmImports}}function createWasm(){var info=getWasmImports();function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=Asyncify.instrumentWasmExports(wasmExports);Module["wasmExports"]=wasmExports;wasmMemory=wasmExports["memory"];updateMemoryViews();wasmTable=wasmExports["__indirect_function_table"];addOnInit(wasmExports["__wasm_call_ctors"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);return false}}if(!wasmBinaryFile)wasmBinaryFile=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult);return{}}var tempDouble;var tempI64;function __asyncjs__js_popen_to_file(command,mode,exitCodePtr){return Asyncify.handleAsync(async()=>{const returnCallback=resolver=>new Promise(resolver);if(!command)return 1;const cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;const modestr=UTF8ToString(mode);if(!modestr.length)return 0;if(modestr==="w"){console.error('popen($cmd, "w") is not implemented yet')}return returnCallback(async wakeUp=>{let cp;try{cp=PHPWASM.spawnProcess(cmdstr,[]);if(cp instanceof Promise){cp=await cp}}catch(e){console.error(e);if(e.code==="SPAWN_UNSUPPORTED"){return 1}throw e}const outByteArrays=[];cp.stdout.on("data",function(data){outByteArrays.push(data)});const outputPath="/tmp/popen_output";cp.on("exit",function(exitCode){const outBytes=new Uint8Array(outByteArrays.reduce((acc,curr)=>acc+curr.length,0));let offset=0;for(const byteArray of outByteArrays){outBytes.set(byteArray,offset);offset+=byteArray.length}FS.writeFile(outputPath,outBytes);HEAPU8[exitCodePtr]=exitCode;wakeUp(allocateUTF8OnStack(outputPath))})})})}__asyncjs__js_popen_to_file.sig="iiii";function __asyncjs__wasm_poll_socket(socketd,events,timeout){return Asyncify.handleAsync(async()=>{const returnCallback=resolver=>new Promise(resolver);const POLLIN=1;const POLLPRI=2;const POLLOUT=4;const POLLERR=8;const POLLHUP=16;const POLLNVAL=32;return returnCallback(wakeUp=>{const polls=[];if(socketd in PHPWASM.child_proc_by_fd){const procInfo=PHPWASM.child_proc_by_fd[socketd];if(procInfo.exited){wakeUp(0);return}polls.push(PHPWASM.awaitEvent(procInfo.stdout,"data"))}else if(FS.isSocket(FS.getStream(socketd)?.node.mode)){const sock=getSocketFromFD(socketd);if(!sock){wakeUp(0);return}const lookingFor=new Set;if(events&POLLIN||events&POLLPRI){if(sock.server){for(const client of sock.pending){if((client.recv_queue||[]).length>0){wakeUp(1);return}}}else if((sock.recv_queue||[]).length>0){wakeUp(1);return}}const webSockets=PHPWASM.getAllWebSockets(sock);if(!webSockets.length){wakeUp(0);return}for(const ws of webSockets){if(events&POLLIN||events&POLLPRI){polls.push(PHPWASM.awaitData(ws));lookingFor.add("POLLIN")}if(events&POLLOUT){polls.push(PHPWASM.awaitConnection(ws));lookingFor.add("POLLOUT")}if(events&POLLHUP){polls.push(PHPWASM.awaitClose(ws));lookingFor.add("POLLHUP")}if(events&POLLERR||events&POLLNVAL){polls.push(PHPWASM.awaitError(ws));lookingFor.add("POLLERR")}}}else{setTimeout(function(){wakeUp(1)},timeout);return}if(polls.length===0){console.warn("Unsupported poll event "+events+", defaulting to setTimeout().");setTimeout(function(){wakeUp(0)},timeout);return}const promises=polls.map(([promise])=>promise);const clearPolling=()=>polls.forEach(([,clear])=>clear());let awaken=false;let timeoutId;Promise.race(promises).then(function(results){if(!awaken){awaken=true;wakeUp(1);if(timeoutId){clearTimeout(timeoutId)}clearPolling()}});if(timeout!==-1){timeoutId=setTimeout(function(){if(!awaken){awaken=true;wakeUp(0);clearPolling()}},timeout)}})})}__asyncjs__wasm_poll_socket.sig="iiii";function __asyncjs__js_fd_read(fd,iov,iovcnt,pnum){return Asyncify.handleAsync(async()=>{const returnCallback=resolver=>new Promise(resolver);if(Asyncify?.State?.Normal===undefined||Asyncify?.state===Asyncify?.State?.Normal){var returnCode;var stream;let num=0;try{const num=__wasmfs_read(fd,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError")){throw e}if(e.errno!==6||!(stream?.fd in PHPWASM.child_proc_by_fd)){HEAPU32[pnum>>2]=0;return returnCode}}}return returnCallback(wakeUp=>{var retries=0;var interval=50;var timeout=5e3;var maxRetries=timeout/interval;function poll(){var returnCode;var stream;let num;try{num=__wasmfs_read(fd,iov,iovcnt);returnCode=0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError")){console.error(e);throw e}returnCode=e.errno}const success=returnCode===0;const failure=++retries>maxRetries||!(fd in PHPWASM.child_proc_by_fd)||PHPWASM.child_proc_by_fd[fd]?.exited||FS.isClosed(stream);if(success){HEAPU32[pnum>>2]=num;wakeUp(0)}else if(failure){HEAPU32[pnum>>2]=0;wakeUp(returnCode===6?0:returnCode)}else{setTimeout(poll,interval)}}poll()})})}__asyncjs__js_fd_read.sig="iiiii";function __asyncjs__js_module_onMessage(data,response_buffer){return Asyncify.handleAsync(async()=>{if(Module["onMessage"]){const dataStr=UTF8ToString(data);return Module["onMessage"](dataStr).then(response=>{const responseBytes=typeof response==="string"?(new TextEncoder).encode(response):response;const responseSize=responseBytes.byteLength;const responsePtr=_malloc(responseSize+1);HEAPU8.set(responseBytes,responsePtr);HEAPU8[responsePtr+responseSize]=0;HEAPU8[response_buffer]=responsePtr;HEAPU8[response_buffer+1]=responsePtr>>8;HEAPU8[response_buffer+2]=responsePtr>>16;HEAPU8[response_buffer+3]=responsePtr>>24;return responseSize}).catch(e=>{console.error(e);return-1})}})}__asyncjs__js_module_onMessage.sig="iii";function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module["noExitRuntime"]||false;function _SharpYuvConvert(){abort("missing function: SharpYuvConvert")}_SharpYuvConvert.stub=true;function _SharpYuvGetConversionMatrix(){abort("missing function: SharpYuvGetConversionMatrix")}_SharpYuvGetConversionMatrix.stub=true;function _SharpYuvInit(){abort("missing function: SharpYuvInit")}_SharpYuvInit.stub=true;var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;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 UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";Module["UTF8ToString"]=UTF8ToString;var ___assert_fail=(condition,filename,line,func)=>{abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr);if(Asyncify.isAsyncExport(func)){wasmTableMirror[funcPtr]=func=Asyncify.makeAsyncFunction(func)}}return func};var ___call_sighandler=(fp,sig)=>getWasmTableEntry(fp)(sig);var __abort_js=()=>{abort("")};var nowIsMonotonic=1;var __emscripten_get_now_is_monotonic=()=>nowIsMonotonic;var inetPton4=str=>{var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0};var jstoi_q=str=>parseInt(str);var inetPton6=str=>{var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w{var nameString=UTF8ToString(name);return inetPton4(DNS.lookup_name(nameString))};var __emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function __gmtime_js(time_low,time_high,tmPtr){var time=convertI32PairToI53Checked(time_low,time_high);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday}var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time_low,time_high,tmPtr){var time=convertI32PairToI53Checked(time_low,time_high);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}var setTempRet0=val=>__emscripten_tempret_set(val);var __mktime_js=function(tmPtr){var ret=(()=>{var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>2]=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getYear();var timeMs=date.getTime();if(isNaN(timeMs)){return-1}return timeMs/1e3})();return setTempRet0((tempDouble=ret,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)),ret>>>0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var runtimeKeepaliveCounter=0;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;if(!keepRuntimeAlive()){exitRuntime()}_proc_exit(status)};var _exit=exitJS;Module["_exit"]=_exit;var maybeExit=()=>{if(runtimeExited){return}if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(runtimeExited||ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now;_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:id,timeout_ms:timeout_ms};return 0};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);Module["stringToUTF8"]=stringToUTF8;var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=date=>date.toLocaleTimeString(undefined,{hour12:false,timeZoneName:"short"}).split(" ")[1];var winterName=extractZone(winter);var summerName=extractZone(summer);if(summerOffsetHEAPU8.set(wasmFSPreloadedFiles[index].fileData,buffer);var wasmFSPreloadedDirs=[];var __wasmfs_get_num_preloaded_dirs=()=>wasmFSPreloadedDirs.length;var wasmFSPreloadedFiles=[];var wasmFSPreloadingFlushed=false;var __wasmfs_get_num_preloaded_files=()=>{wasmFSPreloadingFlushed=true;return wasmFSPreloadedFiles.length};var __wasmfs_get_preloaded_child_path=(index,childNameBuffer)=>{var s=wasmFSPreloadedDirs[index].childName;var len=lengthBytesUTF8(s)+1;stringToUTF8(s,childNameBuffer,len)};var __wasmfs_get_preloaded_file_mode=index=>wasmFSPreloadedFiles[index].mode;var __wasmfs_get_preloaded_file_size=index=>wasmFSPreloadedFiles[index].fileData.length;var __wasmfs_get_preloaded_parent_path=(index,parentPathBuffer)=>{var s=wasmFSPreloadedDirs[index].parentPath;var len=lengthBytesUTF8(s)+1;stringToUTF8(s,parentPathBuffer,len)};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};Module["lengthBytesUTF8"]=lengthBytesUTF8;var __wasmfs_get_preloaded_path_name=(index,fileNameBuffer)=>{var s=wasmFSPreloadedFiles[index].pathName;var len=lengthBytesUTF8(s)+1;stringToUTF8(s,fileNameBuffer,len)};var __wasmfs_jsimpl_alloc_file=(backend,file)=>wasmFS$backends[backend].allocFile(file);var __wasmfs_jsimpl_free_file=(backend,file)=>wasmFS$backends[backend].freeFile(file);var __wasmfs_jsimpl_get_size=(backend,file)=>wasmFS$backends[backend].getSize(file);function __wasmfs_jsimpl_read(backend,file,buffer,length,offset_low,offset_high){var offset=convertI32PairToI53Checked(offset_low,offset_high);if(!wasmFS$backends[backend].read){return-28}return wasmFS$backends[backend].read(file,buffer,length,offset)}function __wasmfs_jsimpl_write(backend,file,buffer,length,offset_low,offset_high){var offset=convertI32PairToI53Checked(offset_low,offset_high);if(!wasmFS$backends[backend].write){return-28}return wasmFS$backends[backend].write(file,buffer,length,offset)}class HandleAllocator{constructor(){this.allocated=[undefined];this.freelist=[]}get(id){return this.allocated[id]}has(id){return this.allocated[id]!==undefined}allocate(handle){var id=this.freelist.pop()||this.allocated.length;this.allocated[id]=handle;return id}free(id){this.allocated[id]=undefined;this.freelist.push(id)}}var wasmfsOPFSAccessHandles=new HandleAllocator;var wasmfsOPFSProxyFinish=ctx=>{};async function __wasmfs_opfs_close_access(ctx,accessID,errPtr){let accessHandle=wasmfsOPFSAccessHandles.get(accessID);try{await accessHandle.close()}catch{let err=-29;HEAP32[errPtr>>2]=err}wasmfsOPFSAccessHandles.free(accessID);wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_close_access.isAsync=true;var wasmfsOPFSBlobs=new HandleAllocator;var __wasmfs_opfs_close_blob=blobID=>{wasmfsOPFSBlobs.free(blobID)};async function __wasmfs_opfs_flush_access(ctx,accessID,errPtr){let accessHandle=wasmfsOPFSAccessHandles.get(accessID);try{await accessHandle.flush()}catch{let err=-29;HEAP32[errPtr>>2]=err}wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_flush_access.isAsync=true;var wasmfsOPFSDirectoryHandles=new HandleAllocator;var __wasmfs_opfs_free_directory=dirID=>{wasmfsOPFSDirectoryHandles.free(dirID)};var wasmfsOPFSFileHandles=new HandleAllocator;var __wasmfs_opfs_free_file=fileID=>{wasmfsOPFSFileHandles.free(fileID)};async function wasmfsOPFSGetOrCreateFile(parent,name,create){let parentHandle=wasmfsOPFSDirectoryHandles.get(parent);let fileHandle;try{fileHandle=await parentHandle.getFileHandle(name,{create:create})}catch(e){if(e.name==="NotFoundError"){return-20}if(e.name==="TypeMismatchError"){return-31}return-29}return wasmfsOPFSFileHandles.allocate(fileHandle)}wasmfsOPFSGetOrCreateFile.isAsync=true;async function wasmfsOPFSGetOrCreateDir(parent,name,create){let parentHandle=wasmfsOPFSDirectoryHandles.get(parent);let childHandle;try{childHandle=await parentHandle.getDirectoryHandle(name,{create:create})}catch(e){if(e.name==="NotFoundError"){return-20}if(e.name==="TypeMismatchError"){return-54}return-29}return wasmfsOPFSDirectoryHandles.allocate(childHandle)}wasmfsOPFSGetOrCreateDir.isAsync=true;async function __wasmfs_opfs_get_child(ctx,parent,namePtr,childTypePtr,childIDPtr){let name=UTF8ToString(namePtr);let childType=1;let childID=await wasmfsOPFSGetOrCreateFile(parent,name,false);if(childID==-31){childType=2;childID=await wasmfsOPFSGetOrCreateDir(parent,name,false)}HEAP32[childTypePtr>>2]=childType;HEAP32[childIDPtr>>2]=childID;wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_get_child.isAsync=true;var stackSave=()=>_emscripten_stack_get_current();var stackRestore=val=>__emscripten_stack_restore(val);async function __wasmfs_opfs_get_entries(ctx,dirID,entriesPtr,errPtr){let dirHandle=wasmfsOPFSDirectoryHandles.get(dirID);try{let iter=dirHandle.entries();for(let entry;entry=await iter.next(),!entry.done;){let[name,child]=entry.value;let sp=stackSave();let namePtr=stringToUTF8OnStack(name);let type=child.kind=="file"?1:2;__wasmfs_opfs_record_entry(entriesPtr,namePtr,type);stackRestore(sp)}}catch{let err=-29;HEAP32[errPtr>>2]=err}wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_get_entries.isAsync=true;async function __wasmfs_opfs_get_size_access(ctx,accessID,sizePtr){let accessHandle=wasmfsOPFSAccessHandles.get(accessID);let size;try{size=await accessHandle.getSize()}catch{size=-29}tempI64=[size>>>0,(tempDouble=size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[sizePtr>>2]=tempI64[0],HEAP32[sizePtr+4>>2]=tempI64[1];wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_get_size_access.isAsync=true;var __wasmfs_opfs_get_size_blob=blobID=>wasmfsOPFSBlobs.get(blobID).size;async function __wasmfs_opfs_get_size_file(ctx,fileID,sizePtr){let fileHandle=wasmfsOPFSFileHandles.get(fileID);let size;try{size=(await fileHandle.getFile()).size}catch{size=-29}tempI64=[size>>>0,(tempDouble=size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[sizePtr>>2]=tempI64[0],HEAP32[sizePtr+4>>2]=tempI64[1];wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_get_size_file.isAsync=true;async function __wasmfs_opfs_init_root_directory(ctx){if(wasmfsOPFSDirectoryHandles.allocated.length==1){let root=await navigator.storage.getDirectory();wasmfsOPFSDirectoryHandles.allocated.push(root)}wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_init_root_directory.isAsync=true;async function __wasmfs_opfs_insert_directory(ctx,parent,namePtr,childIDPtr){let name=UTF8ToString(namePtr);let childID=await wasmfsOPFSGetOrCreateDir(parent,name,true);HEAP32[childIDPtr>>2]=childID;wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_insert_directory.isAsync=true;async function __wasmfs_opfs_insert_file(ctx,parent,namePtr,childIDPtr){let name=UTF8ToString(namePtr);let childID=await wasmfsOPFSGetOrCreateFile(parent,name,true);HEAP32[childIDPtr>>2]=childID;wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_insert_file.isAsync=true;async function __wasmfs_opfs_move_file(ctx,fileID,newParentID,namePtr,errPtr){let name=UTF8ToString(namePtr);let fileHandle=wasmfsOPFSFileHandles.get(fileID);let newDirHandle=wasmfsOPFSDirectoryHandles.get(newParentID);try{await fileHandle.move(newDirHandle,name)}catch{let err=-29;HEAP32[errPtr>>2]=err}wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_move_file.isAsync=true;class FileSystemAsyncAccessHandle{constructor(handle){this.handle=handle}async close(){}async flush(){}async getSize(){let file=await this.handle.getFile();return file.size}async read(buffer,options={at:0}){let file=await this.handle.getFile();let slice=await file.slice(options.at,options.at+buffer.length);let fileBuffer=await slice.arrayBuffer();let array=new Uint8Array(fileBuffer);buffer.set(array);return array.length}async write(buffer,options={at:0}){let writable=await this.handle.createWritable({keepExistingData:true});await writable.write({type:"write",position:options.at,data:buffer});await writable.close();return buffer.length}async truncate(size){let writable=await this.handle.createWritable({keepExistingData:true});await writable.truncate(size);await writable.close()}}var wasmfsOPFSCreateAsyncAccessHandle=fileHandle=>new FileSystemAsyncAccessHandle(fileHandle);async function __wasmfs_opfs_open_access(ctx,fileID,accessIDPtr){let fileHandle=wasmfsOPFSFileHandles.get(fileID);let accessID;try{let accessHandle;accessHandle=await wasmfsOPFSCreateAsyncAccessHandle(fileHandle);accessID=wasmfsOPFSAccessHandles.allocate(accessHandle)}catch(e){if(e.name==="InvalidStateError"||e.name==="NoModificationAllowedError"){accessID=-2}else{accessID=-29}}HEAP32[accessIDPtr>>2]=accessID;wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_open_access.isAsync=true;async function __wasmfs_opfs_open_blob(ctx,fileID,blobIDPtr){let fileHandle=wasmfsOPFSFileHandles.get(fileID);let blobID;try{let blob=await fileHandle.getFile();blobID=wasmfsOPFSBlobs.allocate(blob)}catch(e){if(e.name==="NotAllowedError"){blobID=-2}else{blobID=-29}}HEAP32[blobIDPtr>>2]=blobID;wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_open_blob.isAsync=true;async function __wasmfs_opfs_read_access(accessID,bufPtr,len,pos){let accessHandle=wasmfsOPFSAccessHandles.get(accessID);let data=HEAPU8.subarray(bufPtr,bufPtr+len);try{return await accessHandle.read(data,{at:pos})}catch(e){if(e.name=="TypeError"){return-28}return-29}}__wasmfs_opfs_read_access.isAsync=true;async function __wasmfs_opfs_read_blob(ctx,blobID,bufPtr,len,pos,nreadPtr){let blob=wasmfsOPFSBlobs.get(blobID);let slice=blob.slice(pos,pos+len);let nread=0;try{let buf=await slice.arrayBuffer();let data=new Uint8Array(buf);HEAPU8.set(data,bufPtr);nread+=data.length}catch(e){if(e instanceof RangeError){nread=-21}else{nread=-29}}HEAP32[nreadPtr>>2]=nread;wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_read_blob.isAsync=true;async function __wasmfs_opfs_remove_child(ctx,dirID,namePtr,errPtr){let name=UTF8ToString(namePtr);let dirHandle=wasmfsOPFSDirectoryHandles.get(dirID);try{await dirHandle.removeEntry(name)}catch{let err=-29;HEAP32[errPtr>>2]=err}wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_remove_child.isAsync=true;async function __wasmfs_opfs_set_size_access(ctx,accessID,size_low,size_high,errPtr){var size=convertI32PairToI53Checked(size_low,size_high);let accessHandle=wasmfsOPFSAccessHandles.get(accessID);try{await accessHandle.truncate(size)}catch{let err=-29;HEAP32[errPtr>>2]=err}wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_set_size_access.isAsync=true;async function __wasmfs_opfs_set_size_file(ctx,fileID,size_low,size_high,errPtr){var size=convertI32PairToI53Checked(size_low,size_high);let fileHandle=wasmfsOPFSFileHandles.get(fileID);try{let writable=await fileHandle.createWritable({keepExistingData:true});await writable.truncate(size);await writable.close()}catch{let err=-29;HEAP32[errPtr>>2]=err}wasmfsOPFSProxyFinish(ctx)}__wasmfs_opfs_set_size_file.isAsync=true;async function __wasmfs_opfs_write_access(accessID,bufPtr,len,pos){let accessHandle=wasmfsOPFSAccessHandles.get(accessID);let data=HEAPU8.subarray(bufPtr,bufPtr+len);try{return await accessHandle.write(data,{at:pos})}catch(e){if(e.name=="TypeError"){return-28}return-29}}__wasmfs_opfs_write_access.isAsync=true;var FS_stdin_getChar_buffer=[];function 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(typeof window!="undefined"&&typeof window.prompt=="function"){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 __wasmfs_stdin_get_char=()=>{var c=FS_stdin_getChar();if(typeof c==="number"){return c}return-1};var _emscripten_date_now=()=>Date.now();var _emscripten_err=str=>err(UTF8ToString(str));var getHeapMax=()=>2147483648;var _emscripten_get_heap_max=()=>getHeapMax();var _emscripten_out=str=>out(UTF8ToString(str));var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;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,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var runtimeKeepalivePush=()=>{runtimeKeepaliveCounter+=1};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var safeSetTimeout=(func,timeout)=>{runtimeKeepalivePush();return setTimeout(()=>{runtimeKeepalivePop();callUserCallback(func)},timeout)};var _emscripten_sleep=ms=>Asyncify.handleSleep(wakeUp=>safeSetTimeout(wakeUp,ms));Module["_emscripten_sleep"]=_emscripten_sleep;_emscripten_sleep.isAsync=true;var ENV = PHPLoader.ENV || {};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"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};var stringToAscii=(str,buffer)=>{for(var i=0;i{var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var inetNtop4=addr=>(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255);var inetNtop6=ints=>{var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word{HEAPU8.fill(0,address,address+size);return address};var writeSockaddr=(sa,family,addr,port,addrlen)=>{switch(family){case 2:addr=inetPton4(addr);zeroMemory(sa,16);if(addrlen){HEAP32[addrlen>>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);break;default:return 5}return 0};var _getaddrinfo=(node,service,hint,out)=>{var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var errno;salen=family===10?28:16;addr=family===10?inetNtop6(addr):inetNtop4(addr);sa=_malloc(salen);errno=writeSockaddr(sa,family,addr,port);assert(!errno);ai=_malloc(32);HEAP32[ai+4>>2]=family;HEAP32[ai+8>>2]=type;HEAP32[ai+12>>2]=proto;HEAPU32[ai+24>>2]=canon;HEAPU32[ai+20>>2]=sa;if(family===10){HEAP32[ai+16>>2]=28}else{HEAP32[ai+16>>2]=16}HEAP32[ai+28>>2]=0;return ai}if(hint){flags=HEAP32[hint>>2];family=HEAP32[hint+4>>2];type=HEAP32[hint+8>>2];proto=HEAP32[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}node=UTF8ToString(node);addr=inetPton4(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=inetPton6(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAPU32[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=inetPton4(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var _getentropy=(buffer,size)=>{randomFill(HEAPU8.subarray(buffer,buffer+size));return 0};var readSockaddr=(sa,salen)=>{var family=HEAP16[sa>>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}};var _getnameinfo=(sa,salen,node,nodelen,serv,servlen,flags)=>{var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0};var Protocols={list:[],map:{}};var _setprotoent=stayopen=>{function allocprotoent(name,proto,aliases){var nameBuf=_malloc(name.length+1);stringToAscii(name,nameBuf);var j=0;var length=aliases.length;var aliasListBuf=_malloc((length+1)*4);for(var i=0;i>2]=aliasBuf}HEAPU32[aliasListBuf+j>>2]=0;var pe=_malloc(12);HEAPU32[pe>>2]=nameBuf;HEAPU32[pe+4>>2]=aliasListBuf;HEAP32[pe+8>>2]=proto;return pe}var list=Protocols.list;var map=Protocols.map;if(list.length===0){var entry=allocprotoent("tcp",6,["TCP"]);list.push(entry);map["tcp"]=map["6"]=entry;entry=allocprotoent("udp",17,["UDP"]);list.push(entry);map["udp"]=map["17"]=entry}_setprotoent.index=0};var _getprotobyname=name=>{name=UTF8ToString(name);_setprotoent(true);var result=Protocols.map[name];return result};var _getprotobynumber=number=>{_setprotoent(true);var result=Protocols.map[number];return result};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 allocateUTF8OnStack=stringToUTF8OnStack;var PHPWASM={init:function(){PHPWASM.EventEmitter=ENVIRONMENT_IS_NODE?require("events").EventEmitter:class EventEmitter{constructor(){this.listeners={}}emit(eventName,data){if(this.listeners[eventName]){this.listeners[eventName].forEach(callback=>{callback(data)})}}once(eventName,callback){const self=this;function removedCallback(){callback(...arguments);self.removeListener(eventName,removedCallback)}this.on(eventName,removedCallback)}removeAllListeners(eventName){if(eventName){delete this.listeners[eventName]}else{this.listeners={}}}removeListener(eventName,callback){if(this.listeners[eventName]){const idx=this.listeners[eventName].indexOf(callback);if(idx!==-1){this.listeners[eventName].splice(idx,1)}}}};PHPWASM.child_proc_by_fd={};PHPWASM.child_proc_by_pid={};PHPWASM.input_devices={}},getAllWebSockets:function(sock){const webSockets=new Set;if(sock.server){sock.server.clients.forEach(ws=>{webSockets.add(ws)})}for(const peer of PHPWASM.getAllPeers(sock)){webSockets.add(peer.socket)}return Array.from(webSockets)},getAllPeers:function(sock){const peers=new Set;if(sock.server){sock.pending.filter(pending=>pending.peers).forEach(pending=>{for(const peer of Object.values(pending.peers)){peers.add(peer)}})}if(sock.peers){for(const peer of Object.values(sock.peers)){peers.add(peer)}}return Array.from(peers)},awaitData:function(ws){return PHPWASM.awaitEvent(ws,"message")},awaitConnection:function(ws){if(ws.OPEN===ws.readyState){return[Promise.resolve(),PHPWASM.noop]}return PHPWASM.awaitEvent(ws,"open")},awaitClose:function(ws){if([ws.CLOSING,ws.CLOSED].includes(ws.readyState)){return[Promise.resolve(),PHPWASM.noop]}return PHPWASM.awaitEvent(ws,"close")},awaitError:function(ws){if([ws.CLOSING,ws.CLOSED].includes(ws.readyState)){return[Promise.resolve(),PHPWASM.noop]}return PHPWASM.awaitEvent(ws,"error")},awaitEvent:function(ws,event){let resolve;const listener=()=>{resolve()};const promise=new Promise(function(_resolve){resolve=_resolve;ws.once(event,listener)});const cancel=()=>{ws.removeListener(event,listener);setTimeout(resolve)};return[promise,cancel]},noop:function(){},spawnProcess:function(command,args,options){if(Module["spawnProcess"]){const spawnedPromise=Module["spawnProcess"](command,args,options);return Promise.resolve(spawnedPromise).then(function(spawned){if(!spawned||!spawned.on){throw new Error("spawnProcess() must return an EventEmitter but returned a different type.")}return spawned})}if(ENVIRONMENT_IS_NODE){return require("child_process").spawn(command,args,{...options,shell:true,stdio:["pipe","pipe","pipe"],timeout:100})}const e=new Error("popen(), proc_open() etc. are unsupported in the browser. Call php.setSpawnHandler() "+"and provide a callback to handle spawning processes, or disable a popen(), proc_open() "+"and similar functions via php.ini.");e.code="SPAWN_UNSUPPORTED";throw e},shutdownSocket:function(socketd,how){const sock=getSocketFromFD(socketd);const peer=Object.values(sock.peers)[0];if(!peer){return-1}try{peer.socket.close();SOCKFS.websocket_sock_ops.removePeer(sock,peer);return 0}catch(e){console.log("Socket shutdown error",e);return-1}}};function _js_create_input_device(deviceId){let dataBuffer=[];let dataCallback;const filename="proc_id_"+deviceId;const device=FS.createDevice("/dev",filename,function(){},function(byte){try{dataBuffer.push(byte);if(dataCallback){dataCallback(new Uint8Array(dataBuffer));dataBuffer=[]}}catch(e){console.error(e);throw e}});const devicePath="/dev/"+filename;PHPWASM.input_devices[deviceId]={devicePath:devicePath,onData:function(cb){dataCallback=cb;dataBuffer.forEach(function(data){cb(data)});dataBuffer.length=0}};return allocateUTF8OnStack(devicePath)}function _js_open_process(command,argsPtr,argsLength,descriptorsPtr,descriptorsLength,cwdPtr,cwdLength,envPtr,envLength){if(!command){return 1}const cmdstr=UTF8ToString(command);if(!cmdstr.length){return 0}let argsArray=[];if(argsLength){for(var i=0;i>2]))}}const cwdstr=cwdPtr?UTF8ToString(cwdPtr):null;let envObject=null;if(envLength){envObject={};for(var i=0;i>2]);const splitAt=envEntry.indexOf("=");if(splitAt===-1){continue}const key=envEntry.substring(0,splitAt);const value=envEntry.substring(splitAt+1);envObject[key]=value}}var std={};for(var i=0;i>2];std[HEAPU32[descriptorPtr>>2]]={child:HEAPU32[descriptorPtr+4>>2],parent:HEAPU32[descriptorPtr+8>>2]}}return Asyncify.handleSleep(async wakeUp=>{let cp;try{const options={};if(cwdstr!==null){options.cwd=cwdstr}if(envObject!==null){options.env=envObject}cp=PHPWASM.spawnProcess(cmdstr,argsArray,options);if(cp instanceof Promise){cp=await cp}}catch(e){if(e.code==="SPAWN_UNSUPPORTED"){wakeUp(1);return}console.error(e);wakeUp(1);throw e}const ProcInfo={pid:cp.pid,exited:false,stdinFd:std[0]?.child,stdinIsDevice:std[0]?.child in PHPWASM.input_devices,stdoutChildFd:std[1]?.child,stdoutParentFd:std[1]?.parent,stderrChildFd:std[2]?.child,stderrParentFd:std[2]?.parent,stdout:new PHPWASM.EventEmitter,stderr:new PHPWASM.EventEmitter};if(ProcInfo.stdoutChildFd)PHPWASM.child_proc_by_fd[ProcInfo.stdoutChildFd]=ProcInfo;if(ProcInfo.stderrChildFd)PHPWASM.child_proc_by_fd[ProcInfo.stderrChildFd]=ProcInfo;if(ProcInfo.stdoutParentFd)PHPWASM.child_proc_by_fd[ProcInfo.stdoutParentFd]=ProcInfo;if(ProcInfo.stderrParentFd)PHPWASM.child_proc_by_fd[ProcInfo.stderrParentFd]=ProcInfo;PHPWASM.child_proc_by_pid[ProcInfo.pid]=ProcInfo;cp.on("exit",function(code){ProcInfo.exitCode=code;ProcInfo.exited=true;ProcInfo.stdout.emit("data");ProcInfo.stderr.emit("data")});if(ProcInfo.stdoutChildFd){const stdoutStream=SYSCALLS.getStreamFromFD(ProcInfo.stdoutChildFd);let stdoutAt=0;cp.stdout.on("data",function(data){ProcInfo.stdout.emit("data",data);stdoutStream.stream_ops.write(stdoutStream,data,0,data.length,stdoutAt);stdoutAt+=data.length})}if(ProcInfo.stderrChildFd){const stderrStream=SYSCALLS.getStreamFromFD(ProcInfo.stderrChildFd);let stderrAt=0;cp.stderr.on("data",function(data){ProcInfo.stderr.emit("data",data);stderrStream.stream_ops.write(stderrStream,data,0,data.length,stderrAt);stderrAt+=data.length})}try{await new Promise((resolve,reject)=>{cp.on("spawn",resolve);cp.on("error",reject)})}catch(e){console.error(e);wakeUp(1);return}if(ProcInfo.stdinIsDevice){PHPWASM.input_devices[ProcInfo.stdinFd].onData(function(data){if(!data)return;if(typeof data==="number"){data=new Uint8Array([data])}const dataStr=new TextDecoder("utf-8").decode(data);cp.stdin.write(dataStr)});wakeUp(ProcInfo.pid);return}if(ProcInfo.stdinFd){const stdinStream=SYSCALLS.getStreamFromFD(ProcInfo.stdinFd);if(stdinStream.node){const CHUNK_SIZE=1024;const buffer=new Uint8Array(CHUNK_SIZE);let offset=0;while(true){const bytesRead=stdinStream.stream_ops.read(stdinStream,buffer,0,CHUNK_SIZE,offset);if(bytesRead===null||bytesRead===0){break}try{cp.stdin.write(buffer.subarray(0,bytesRead))}catch(e){console.error(e);return 1}if(bytesRead>2]=PHPWASM.child_proc_by_pid[pid].exitCode;return 1}return 0}function _js_waitpid(pid,exitCodePtr){if(!PHPWASM.child_proc_by_pid[pid]){return-1}return Asyncify.handleSleep(wakeUp=>{const poll=function(){if(PHPWASM.child_proc_by_pid[pid]?.exited){HEAPU32[exitCodePtr>>2]=PHPWASM.child_proc_by_pid[pid].exitCode;wakeUp(pid)}else{setTimeout(poll,50)}};poll()})}var arraySum=(array,index)=>{var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum};var MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];var addDays=(date,days)=>{var newDate=new Date(date.getTime());while(days>0){var leap=isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var _strftime=(s,maxsize,format,tm)=>{var tm_zone=HEAPU32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":date=>WEEKDAYS[date.tm_wday].substring(0,3),"%A":date=>WEEKDAYS[date.tm_wday],"%b":date=>MONTHS[date.tm_mon].substring(0,3),"%B":date=>MONTHS[date.tm_mon],"%C":date=>{var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":date=>leadingNulls(date.tm_mday,2),"%e":date=>leadingSomething(date.tm_mday,2," "),"%g":date=>getWeekBasedYear(date).toString().substring(2),"%G":getWeekBasedYear,"%H":date=>leadingNulls(date.tm_hour,2),"%I":date=>{var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":date=>leadingNulls(date.tm_mday+arraySum(isLeapYear(date.tm_year+1900)?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR,date.tm_mon-1),3),"%m":date=>leadingNulls(date.tm_mon+1,2),"%M":date=>leadingNulls(date.tm_min,2),"%n":()=>"\n","%p":date=>{if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":date=>leadingNulls(date.tm_sec,2),"%t":()=>"\t","%u":date=>date.tm_wday||7,"%U":date=>{var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":date=>{var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":date=>date.tm_wday,"%W":date=>{var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":date=>(date.tm_year+1900).toString().substring(2),"%Y":date=>date.tm_year+1900,"%z":date=>{var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":date=>date.tm_zone,"%%":()=>"%"};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1};var _strftime_l=(s,maxsize,format,tm,loc)=>_strftime(s,maxsize,format,tm);var _strptime=(buf,format,tm)=>{var pattern=UTF8ToString(format);var SPECIAL_CHARS="\\!@#$^&*()+=-[]/{}|:<>?,.";for(var i=0,ii=SPECIAL_CHARS.length;iEQUIVALENT_MATCHERS[c]||m).replace(/%(.)/g,(_,c)=>{let pat=DATE_PATTERNS[c];if(pat){capture.push(c);return`(${pat})`}else{return c}}).replace(/\s+/g,"\\s*");var matches=new RegExp("^"+pattern_out,"i").exec(UTF8ToString(buf));function initDate(){function fixup(value,min,max){return typeof value!="number"||isNaN(value)?min:value>=min?value<=max?value:max:min}return{year:fixup(HEAP32[tm+20>>2]+1900,1970,9999),month:fixup(HEAP32[tm+16>>2],0,11),day:fixup(HEAP32[tm+12>>2],1,31),hour:fixup(HEAP32[tm+8>>2],0,23),min:fixup(HEAP32[tm+4>>2],0,59),sec:fixup(HEAP32[tm>>2],0,59),gmtoff:0}}if(matches){var date=initDate();var value;var getMatch=symbol=>{var pos=capture.indexOf(symbol);if(pos>=0){return matches[pos+1]}return};if(value=getMatch("S")){date.sec=jstoi_q(value)}if(value=getMatch("M")){date.min=jstoi_q(value)}if(value=getMatch("H")){date.hour=jstoi_q(value)}else if(value=getMatch("I")){var hour=jstoi_q(value);if(value=getMatch("p")){hour+=value.toUpperCase()[0]==="P"?12:0}date.hour=hour}if(value=getMatch("Y")){date.year=jstoi_q(value)}else if(value=getMatch("y")){var year=jstoi_q(value);if(value=getMatch("C")){year+=jstoi_q(value)*100}else{year+=year<69?2e3:1900}date.year=year}if(value=getMatch("m")){date.month=jstoi_q(value)-1}else if(value=getMatch("b")){date.month=MONTH_NUMBERS[value.substring(0,3).toUpperCase()]||0}if(value=getMatch("d")){date.day=jstoi_q(value)}else if(value=getMatch("j")){var day=jstoi_q(value);var leapYear=isLeapYear(date.year);for(var month=0;month<12;++month){var daysUntilMonth=arraySum(leapYear?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR,month-1);if(day<=daysUntilMonth+(leapYear?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR)[month]){date.day=day-daysUntilMonth}}}else if(value=getMatch("a")){var weekDay=value.substring(0,3).toUpperCase();if(value=getMatch("U")){var weekDayNumber=DAY_NUMBERS_SUN_FIRST[weekDay];var weekNumber=jstoi_q(value);var janFirst=new Date(date.year,0,1);var endDate;if(janFirst.getDay()===0){endDate=addDays(janFirst,weekDayNumber+7*(weekNumber-1))}else{endDate=addDays(janFirst,7-janFirst.getDay()+weekDayNumber+7*(weekNumber-1))}date.day=endDate.getDate();date.month=endDate.getMonth()}else if(value=getMatch("W")){var weekDayNumber=DAY_NUMBERS_MON_FIRST[weekDay];var weekNumber=jstoi_q(value);var janFirst=new Date(date.year,0,1);var endDate;if(janFirst.getDay()===1){endDate=addDays(janFirst,weekDayNumber+7*(weekNumber-1))}else{endDate=addDays(janFirst,7-janFirst.getDay()+1+weekDayNumber+7*(weekNumber-1))}date.day=endDate.getDate();date.month=endDate.getMonth()}}if(value=getMatch("z")){if(value.toLowerCase()==="z"){date.gmtoff=0}else{var match=value.match(/^((?:\-|\+)\d\d):?(\d\d)?/);date.gmtoff=match[1]*3600;if(match[2]){date.gmtoff+=date.gmtoff>0?match[2]*60:-match[2]*60}}}var fullDate=new Date(date.year,date.month,date.day,date.hour,date.min,date.sec,0);HEAP32[tm>>2]=fullDate.getSeconds();HEAP32[tm+4>>2]=fullDate.getMinutes();HEAP32[tm+8>>2]=fullDate.getHours();HEAP32[tm+12>>2]=fullDate.getDate();HEAP32[tm+16>>2]=fullDate.getMonth();HEAP32[tm+20>>2]=fullDate.getFullYear()-1900;HEAP32[tm+24>>2]=fullDate.getDay();HEAP32[tm+28>>2]=arraySum(isLeapYear(fullDate.getFullYear())?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR,fullDate.getMonth()-1)+fullDate.getDate()-1;HEAP32[tm+32>>2]=0;HEAP32[tm+36>>2]=date.gmtoff;return buf+intArrayFromString(matches[0]).length-1}return 0};function _wasm_setsockopt(socketd,level,optionName,optionValuePtr,optionLen){const optionValue=HEAPU8[optionValuePtr];const SOL_SOCKET=1;const SO_KEEPALIVE=9;const IPPROTO_TCP=6;const TCP_NODELAY=1;const isSupported=level===SOL_SOCKET&&optionName===SO_KEEPALIVE||level===IPPROTO_TCP&&optionName===TCP_NODELAY;if(!isSupported){console.warn(`Unsupported socket option: ${level}, ${optionName}, ${optionValue}`);return-1}const ws=PHPWASM.getAllWebSockets(socketd)[0];if(!ws){return-1}ws.setSocketOpt(level,optionName,optionValuePtr);return 0}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.substr(-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.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var withStackSave=f=>{var stack=stackSave();var ret=f();stackRestore(stack);return ret};var readI53FromI64=ptr=>HEAPU32[ptr>>2]+HEAP32[ptr+4>>2]*4294967296;var readI53FromU64=ptr=>HEAPU32[ptr>>2]+HEAPU32[ptr+4>>2]*4294967296;var FS_mknod=(path,mode,dev)=>FS.handleError(withStackSave(()=>{var pathBuffer=stringToUTF8OnStack(path);return __wasmfs_mknod(pathBuffer,mode,dev)}));var FS_create=(path,mode=438)=>{mode&=4095;mode|=32768;return FS_mknod(path,mode,0)};var FS_writeFile=(path,data)=>{var sp=stackSave();var pathBuffer=stringToUTF8OnStack(path);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);data=buf.slice(0,actualNumBytes)}var dataBuffer=_malloc(data.length);for(var i=0;i{var pathName=name?parent+"/"+name:parent;var mode=FS_getMode(canRead,canWrite);if(!wasmFSPreloadingFlushed){wasmFSPreloadedFiles.push({pathName:pathName,fileData:fileData,mode:mode})}else{FS_create(pathName,mode);FS_writeFile(pathName,fileData)}};var asyncLoad=(url,onload,onerror,noRunDep)=>{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,arrayBuffer=>{onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};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).substr(1);to=PATH_FS.resolve(to).substr(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{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,processData,onerror)}else{processData(url)}};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS_modeStringToFlags=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_mkdir=(path,mode=511)=>FS.handleError(withStackSave(()=>{var buffer=stringToUTF8OnStack(path);return __wasmfs_mkdir(buffer,mode)}));var FS_mkdirTree=(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;iwithStackSave(()=>{var buffer=stringToUTF8OnStack(path);return __wasmfs_unlink(buffer)});var wasmFS$backends={};var wasmFSDevices={};var wasmFSDeviceStreams={};var FS={init(){FS.ensureErrnoError()},ErrnoError:null,handleError(returnValue){if(returnValue<0){throw new FS.ErrnoError(-returnValue)}return returnValue},ensureErrnoError(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(code){this.errno=code;this.message="FS error";this.name="ErrnoError"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError},createDataFile(parent,name,fileData,canRead,canWrite,canOwn){FS_createDataFile(parent,name,fileData,canRead,canWrite,canOwn)},createPath(parent,path,canRead,canWrite){var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);if(!wasmFSPreloadingFlushed){wasmFSPreloadedDirs.push({parentPath:parent,childName:part})}else{FS.mkdir(current)}parent=current}return current},createPreloadedFile(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){return FS_createPreloadedFile(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)},readFile(path,opts={}){opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var sp=stackSave();var buf=__wasmfs_read_file(stringToUTF8OnStack(path));stackRestore(sp);var length=readI53FromI64(buf);var ret=new Uint8Array(HEAPU8.subarray(buf+8,buf+8+length));if(opts.encoding==="utf8"){ret=UTF8ArrayToString(ret,0)}return ret},cwd:()=>UTF8ToString(__wasmfs_get_cwd()),analyzePath(path){var exists=!!FS.findObject(path);return{exists:exists,object:{contents:exists?FS.readFile(path):null}}},mkdir:(path,mode)=>FS_mkdir(path,mode),mkdirTree:(path,mode)=>FS_mkdirTree(path,mode),rmdir:path=>FS.handleError(withStackSave(()=>__wasmfs_rmdir(stringToUTF8OnStack(path)))),open:(path,flags,mode)=>withStackSave(()=>{flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;var buffer=stringToUTF8OnStack(path);var fd=FS.handleError(__wasmfs_open(buffer,flags,mode));return{fd:fd}}),create:(path,mode)=>FS_create(path,mode),close:stream=>FS.handleError(-__wasmfs_close(stream.fd)),unlink:path=>FS_unlink(path),chdir:path=>withStackSave(()=>{var buffer=stringToUTF8OnStack(path);return __wasmfs_chdir(buffer)}),read(stream,buffer,offset,length,position){var seeking=typeof position!="undefined";var dataBuffer=_malloc(length);var bytesRead;if(seeking){bytesRead=__wasmfs_pread(stream.fd,dataBuffer,length,position)}else{bytesRead=__wasmfs_read(stream.fd,dataBuffer,length)}bytesRead=FS.handleError(bytesRead);for(var i=0;i>>0,(tempDouble=offset,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0),length>>>0,(tempDouble=length,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)))},writeFile:(path,data)=>FS_writeFile(path,data),mmap:(stream,length,offset,prot,flags)=>{var buf=FS.handleError(__wasmfs_mmap(length,prot,flags,stream.fd,offset>>>0,(tempDouble=offset,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)));return{ptr:buf,allocated:true}},msync:(stream,bufferPtr,offset,length,mmapFlags)=>{assert(offset===0);return FS.handleError(__wasmfs_msync(bufferPtr,length,mmapFlags))},munmap:(addr,length)=>FS.handleError(__wasmfs_munmap(addr,length)),symlink:(target,linkpath)=>withStackSave(()=>__wasmfs_symlink(stringToUTF8OnStack(target),stringToUTF8OnStack(linkpath))),readlink(path){var readBuffer=FS.handleError(withStackSave(()=>__wasmfs_readlink(stringToUTF8OnStack(path))));return UTF8ToString(readBuffer)},statBufToObject(statBuf){return{dev:HEAPU32[statBuf>>2],mode:HEAPU32[statBuf+4>>2],nlink:HEAPU32[statBuf+8>>2],uid:HEAPU32[statBuf+12>>2],gid:HEAPU32[statBuf+16>>2],rdev:HEAPU32[statBuf+20>>2],size:readI53FromI64(statBuf+24),blksize:HEAPU32[statBuf+32>>2],blocks:HEAPU32[statBuf+36>>2],atime:readI53FromI64(statBuf+40),mtime:readI53FromI64(statBuf+56),ctime:readI53FromI64(statBuf+72),ino:readI53FromU64(statBuf+88)}},stat(path){var statBuf=_malloc(96);FS.handleError(withStackSave(()=>__wasmfs_stat(stringToUTF8OnStack(path),statBuf)));var stats=FS.statBufToObject(statBuf);_free(statBuf);return stats},lstat(path){var statBuf=_malloc(96);FS.handleError(withStackSave(()=>__wasmfs_lstat(stringToUTF8OnStack(path),statBuf)));var stats=FS.statBufToObject(statBuf);_free(statBuf);return stats},chmod(path,mode){return FS.handleError(withStackSave(()=>{var buffer=stringToUTF8OnStack(path);return __wasmfs_chmod(buffer,mode)}))},lchmod(path,mode){return FS.handleError(withStackSave(()=>{var buffer=stringToUTF8OnStack(path);return __wasmfs_lchmod(buffer,mode)}))},fchmod(fd,mode){return FS.handleError(__wasmfs_fchmod(fd,mode))},utime:(path,atime,mtime)=>FS.handleError(withStackSave(()=>__wasmfs_utime(stringToUTF8OnStack(path),atime,mtime))),truncate(path,len){return FS.handleError(withStackSave(()=>__wasmfs_truncate(stringToUTF8OnStack(path),len>>>0,(tempDouble=len,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0))))},ftruncate(fd,len){return FS.handleError(__wasmfs_ftruncate(fd,len>>>0,(tempDouble=len,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)))},findObject(path){var result=withStackSave(()=>__wasmfs_identify(stringToUTF8OnStack(path)));if(result==44){return null}return{isFolder:result==31,isDevice:false}},readdir:path=>withStackSave(()=>{var pathBuffer=stringToUTF8OnStack(path);var entries=[];var state=__wasmfs_readdir_start(pathBuffer);if(!state){throw new Error("No such directory")}var entry;while(entry=__wasmfs_readdir_get(state)){entries.push(UTF8ToString(entry))}__wasmfs_readdir_finish(state);return entries}),mount:(type,opts,mountpoint)=>{var backendPointer=type.createBackend(opts);return FS.handleError(withStackSave(()=>__wasmfs_mount(stringToUTF8OnStack(mountpoint),backendPointer)))},unmount:mountpoint=>FS.handleError(withStackSave(()=>__wasmfs_unmount(stringToUTF8OnStack(mountpoint)))),mknod:(path,mode,dev)=>FS_mknod(path,mode,dev),makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){var backendPointer=_wasmfs_create_jsimpl_backend();var definedOps={userRead:ops.read,userWrite:ops.write,allocFile:file=>{wasmFSDeviceStreams[file]={}},freeFile:file=>{wasmFSDeviceStreams[file]=undefined},getSize:file=>{},read:(file,buffer,length,offset)=>{var bufferArray=Module.HEAP8.subarray(buffer,buffer+length);try{var bytesRead=definedOps.userRead(wasmFSDeviceStreams[file],bufferArray,0,length,offset)}catch(e){return-e.errno}Module.HEAP8.set(bufferArray,buffer);return bytesRead},write:(file,buffer,length,offset)=>{var bufferArray=Module.HEAP8.subarray(buffer,buffer+length);try{var bytesWritten=definedOps.userWrite(wasmFSDeviceStreams[file],bufferArray,0,length,offset)}catch(e){return-e.errno}Module.HEAP8.set(bufferArray,buffer);return bytesWritten}};wasmFS$backends[backendPointer]=definedOps;wasmFSDevices[dev]=backendPointer},createDevice(parent,name,input,output){if(typeof parent!="string"){throw new Error("Only string paths are accepted")}var path=PATH.join2(parent,name);var mode=FS_getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{read(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;i_wasmfs_create_file(stringToUTF8OnStack(path),mode,deviceBackend)))},rename(oldPath,newPath){return FS.handleError(withStackSave(()=>{var oldPathBuffer=stringToUTF8OnStack(oldPath);var newPathBuffer=stringToUTF8OnStack(newPath);return __wasmfs_rename(oldPathBuffer,newPathBuffer)}))},llseek(stream,offset,whence){return FS.handleError(__wasmfs_llseek(stream.fd,offset>>>0,(tempDouble=offset,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0),whence))}};Module["FS"]=FS;var Asyncify={instrumentWasmImports(imports){var importPattern=/^(js_open_process|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|invoke_.*|__asyncjs__.*)$/;for(let[x,original]of Object.entries(imports)){if(typeof original=="function"){let isAsyncifyImport=original.isAsync||importPattern.test(x);if(isAsyncifyImport){imports[x]=original=new WebAssembly.Suspending(original)}}}},instrumentWasmExports(exports){var exportPattern=/^(php_wasm_init|wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|main|__main_argc_argv)$/;Asyncify.asyncExports=new Set;var ret={};for(let[x,original]of Object.entries(exports)){if(typeof original=="function"){let isAsyncifyExport=exportPattern.test(x);if(isAsyncifyExport){Asyncify.asyncExports.add(original);original=Asyncify.makeAsyncFunction(original)}ret[x]=(...args)=>original(...args)}else{ret[x]=original}}return ret},asyncExports:null,isAsyncExport(func){return Asyncify.asyncExports?.has(func)},handleAsync:async startAsync=>{runtimeKeepalivePush();try{return await startAsync()}finally{runtimeKeepalivePop()}},handleSleep(startAsync){return Asyncify.handleAsync(()=>new Promise(startAsync))},makeAsyncFunction(original){return WebAssembly.promising(original)}};var getCFunc=ident=>{var func=Module["_"+ident];return func};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==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i(___wasm_call_ctors=wasmExports["__wasm_call_ctors"])();var _free=a0=>(_free=wasmExports["free"])(a0);var _malloc=a0=>(_malloc=wasmExports["malloc"])(a0);var _wasm_read=Module["_wasm_read"]=(a0,a1,a2)=>(_wasm_read=Module["_wasm_read"]=wasmExports["wasm_read"])(a0,a1,a2);var _wasm_popen=Module["_wasm_popen"]=(a0,a1)=>(_wasm_popen=Module["_wasm_popen"]=wasmExports["wasm_popen"])(a0,a1);var _wasm_php_exec=Module["_wasm_php_exec"]=(a0,a1,a2,a3)=>(_wasm_php_exec=Module["_wasm_php_exec"]=wasmExports["wasm_php_exec"])(a0,a1,a2,a3);var _php_pollfd_for=Module["_php_pollfd_for"]=(a0,a1,a2)=>(_php_pollfd_for=Module["_php_pollfd_for"]=wasmExports["php_pollfd_for"])(a0,a1,a2);var _htons=a0=>(_htons=wasmExports["htons"])(a0);var _ntohs=a0=>(_ntohs=wasmExports["ntohs"])(a0);var _htonl=a0=>(_htonl=wasmExports["htonl"])(a0);var _wasm_sleep=Module["_wasm_sleep"]=a0=>(_wasm_sleep=Module["_wasm_sleep"]=wasmExports["wasm_sleep"])(a0);var ___wrap_select=Module["___wrap_select"]=(a0,a1,a2,a3,a4)=>(___wrap_select=Module["___wrap_select"]=wasmExports["__wrap_select"])(a0,a1,a2,a3,a4);var _wasm_set_sapi_name=Module["_wasm_set_sapi_name"]=a0=>(_wasm_set_sapi_name=Module["_wasm_set_sapi_name"]=wasmExports["wasm_set_sapi_name"])(a0);var _wasm_set_phpini_path=Module["_wasm_set_phpini_path"]=a0=>(_wasm_set_phpini_path=Module["_wasm_set_phpini_path"]=wasmExports["wasm_set_phpini_path"])(a0);var _wasm_add_SERVER_entry=Module["_wasm_add_SERVER_entry"]=(a0,a1)=>(_wasm_add_SERVER_entry=Module["_wasm_add_SERVER_entry"]=wasmExports["wasm_add_SERVER_entry"])(a0,a1);var _wasm_add_ENV_entry=Module["_wasm_add_ENV_entry"]=(a0,a1)=>(_wasm_add_ENV_entry=Module["_wasm_add_ENV_entry"]=wasmExports["wasm_add_ENV_entry"])(a0,a1);var _wasm_set_query_string=Module["_wasm_set_query_string"]=a0=>(_wasm_set_query_string=Module["_wasm_set_query_string"]=wasmExports["wasm_set_query_string"])(a0);var _wasm_set_path_translated=Module["_wasm_set_path_translated"]=a0=>(_wasm_set_path_translated=Module["_wasm_set_path_translated"]=wasmExports["wasm_set_path_translated"])(a0);var _wasm_set_skip_shebang=Module["_wasm_set_skip_shebang"]=a0=>(_wasm_set_skip_shebang=Module["_wasm_set_skip_shebang"]=wasmExports["wasm_set_skip_shebang"])(a0);var _wasm_set_request_uri=Module["_wasm_set_request_uri"]=a0=>(_wasm_set_request_uri=Module["_wasm_set_request_uri"]=wasmExports["wasm_set_request_uri"])(a0);var _wasm_set_request_method=Module["_wasm_set_request_method"]=a0=>(_wasm_set_request_method=Module["_wasm_set_request_method"]=wasmExports["wasm_set_request_method"])(a0);var _wasm_set_request_host=Module["_wasm_set_request_host"]=a0=>(_wasm_set_request_host=Module["_wasm_set_request_host"]=wasmExports["wasm_set_request_host"])(a0);var _wasm_set_content_type=Module["_wasm_set_content_type"]=a0=>(_wasm_set_content_type=Module["_wasm_set_content_type"]=wasmExports["wasm_set_content_type"])(a0);var _wasm_set_request_body=Module["_wasm_set_request_body"]=a0=>(_wasm_set_request_body=Module["_wasm_set_request_body"]=wasmExports["wasm_set_request_body"])(a0);var _wasm_set_content_length=Module["_wasm_set_content_length"]=a0=>(_wasm_set_content_length=Module["_wasm_set_content_length"]=wasmExports["wasm_set_content_length"])(a0);var _wasm_set_cookies=Module["_wasm_set_cookies"]=a0=>(_wasm_set_cookies=Module["_wasm_set_cookies"]=wasmExports["wasm_set_cookies"])(a0);var _wasm_set_request_port=Module["_wasm_set_request_port"]=a0=>(_wasm_set_request_port=Module["_wasm_set_request_port"]=wasmExports["wasm_set_request_port"])(a0);var _wasm_sapi_request_shutdown=Module["_wasm_sapi_request_shutdown"]=()=>(_wasm_sapi_request_shutdown=Module["_wasm_sapi_request_shutdown"]=wasmExports["wasm_sapi_request_shutdown"])();var _wasm_sapi_handle_request=Module["_wasm_sapi_handle_request"]=()=>(_wasm_sapi_handle_request=Module["_wasm_sapi_handle_request"]=wasmExports["wasm_sapi_handle_request"])();var _php_wasm_init=Module["_php_wasm_init"]=()=>(_php_wasm_init=Module["_php_wasm_init"]=wasmExports["php_wasm_init"])();var _wasm_free=Module["_wasm_free"]=a0=>(_wasm_free=Module["_wasm_free"]=wasmExports["wasm_free"])(a0);var ___funcs_on_exit=()=>(___funcs_on_exit=wasmExports["__funcs_on_exit"])();var __emscripten_timeout=(a0,a1)=>(__emscripten_timeout=wasmExports["_emscripten_timeout"])(a0,a1);var ___trap=()=>(___trap=wasmExports["__trap"])();var __emscripten_tempret_set=a0=>(__emscripten_tempret_set=wasmExports["_emscripten_tempret_set"])(a0);var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["_emscripten_stack_restore"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["_emscripten_stack_alloc"])(a0);var _emscripten_stack_get_current=Module["_emscripten_stack_get_current"]=()=>(_emscripten_stack_get_current=Module["_emscripten_stack_get_current"]=wasmExports["emscripten_stack_get_current"])();var __wasmfs_read_file=a0=>(__wasmfs_read_file=wasmExports["_wasmfs_read_file"])(a0);var __wasmfs_write_file=(a0,a1,a2)=>(__wasmfs_write_file=wasmExports["_wasmfs_write_file"])(a0,a1,a2);var __wasmfs_mkdir=(a0,a1)=>(__wasmfs_mkdir=wasmExports["_wasmfs_mkdir"])(a0,a1);var __wasmfs_rmdir=a0=>(__wasmfs_rmdir=wasmExports["_wasmfs_rmdir"])(a0);var __wasmfs_open=(a0,a1,a2)=>(__wasmfs_open=wasmExports["_wasmfs_open"])(a0,a1,a2);var __wasmfs_allocate=(a0,a1,a2,a3,a4)=>(__wasmfs_allocate=wasmExports["_wasmfs_allocate"])(a0,a1,a2,a3,a4);var __wasmfs_mknod=(a0,a1,a2)=>(__wasmfs_mknod=wasmExports["_wasmfs_mknod"])(a0,a1,a2);var __wasmfs_unlink=a0=>(__wasmfs_unlink=wasmExports["_wasmfs_unlink"])(a0);var __wasmfs_chdir=a0=>(__wasmfs_chdir=wasmExports["_wasmfs_chdir"])(a0);var __wasmfs_symlink=(a0,a1)=>(__wasmfs_symlink=wasmExports["_wasmfs_symlink"])(a0,a1);var __wasmfs_readlink=a0=>(__wasmfs_readlink=wasmExports["_wasmfs_readlink"])(a0);var __wasmfs_write=(a0,a1,a2)=>(__wasmfs_write=wasmExports["_wasmfs_write"])(a0,a1,a2);var __wasmfs_pwrite=(a0,a1,a2,a3,a4)=>(__wasmfs_pwrite=wasmExports["_wasmfs_pwrite"])(a0,a1,a2,a3,a4);var __wasmfs_chmod=(a0,a1)=>(__wasmfs_chmod=wasmExports["_wasmfs_chmod"])(a0,a1);var __wasmfs_fchmod=(a0,a1)=>(__wasmfs_fchmod=wasmExports["_wasmfs_fchmod"])(a0,a1);var __wasmfs_lchmod=(a0,a1)=>(__wasmfs_lchmod=wasmExports["_wasmfs_lchmod"])(a0,a1);var __wasmfs_llseek=(a0,a1,a2,a3)=>(__wasmfs_llseek=wasmExports["_wasmfs_llseek"])(a0,a1,a2,a3);var __wasmfs_rename=(a0,a1)=>(__wasmfs_rename=wasmExports["_wasmfs_rename"])(a0,a1);var __wasmfs_read=(a0,a1,a2)=>(__wasmfs_read=wasmExports["_wasmfs_read"])(a0,a1,a2);var __wasmfs_pread=(a0,a1,a2,a3,a4)=>(__wasmfs_pread=wasmExports["_wasmfs_pread"])(a0,a1,a2,a3,a4);var __wasmfs_truncate=(a0,a1,a2)=>(__wasmfs_truncate=wasmExports["_wasmfs_truncate"])(a0,a1,a2);var __wasmfs_ftruncate=(a0,a1,a2)=>(__wasmfs_ftruncate=wasmExports["_wasmfs_ftruncate"])(a0,a1,a2);var __wasmfs_close=a0=>(__wasmfs_close=wasmExports["_wasmfs_close"])(a0);var __wasmfs_mmap=(a0,a1,a2,a3,a4,a5)=>(__wasmfs_mmap=wasmExports["_wasmfs_mmap"])(a0,a1,a2,a3,a4,a5);var __wasmfs_msync=(a0,a1,a2)=>(__wasmfs_msync=wasmExports["_wasmfs_msync"])(a0,a1,a2);var __wasmfs_munmap=(a0,a1)=>(__wasmfs_munmap=wasmExports["_wasmfs_munmap"])(a0,a1);var __wasmfs_utime=(a0,a1,a2)=>(__wasmfs_utime=wasmExports["_wasmfs_utime"])(a0,a1,a2);var __wasmfs_stat=(a0,a1)=>(__wasmfs_stat=wasmExports["_wasmfs_stat"])(a0,a1);var __wasmfs_lstat=(a0,a1)=>(__wasmfs_lstat=wasmExports["_wasmfs_lstat"])(a0,a1);var __wasmfs_mount=(a0,a1)=>(__wasmfs_mount=wasmExports["_wasmfs_mount"])(a0,a1);var __wasmfs_unmount=a0=>(__wasmfs_unmount=wasmExports["_wasmfs_unmount"])(a0);var __wasmfs_identify=a0=>(__wasmfs_identify=wasmExports["_wasmfs_identify"])(a0);var __wasmfs_readdir_start=a0=>(__wasmfs_readdir_start=wasmExports["_wasmfs_readdir_start"])(a0);var __wasmfs_readdir_get=a0=>(__wasmfs_readdir_get=wasmExports["_wasmfs_readdir_get"])(a0);var __wasmfs_readdir_finish=a0=>(__wasmfs_readdir_finish=wasmExports["_wasmfs_readdir_finish"])(a0);var __wasmfs_get_cwd=()=>(__wasmfs_get_cwd=wasmExports["_wasmfs_get_cwd"])();var _wasmfs_create_jsimpl_backend=()=>(_wasmfs_create_jsimpl_backend=wasmExports["wasmfs_create_jsimpl_backend"])();var __wasmfs_opfs_record_entry=(a0,a1,a2)=>(__wasmfs_opfs_record_entry=wasmExports["_wasmfs_opfs_record_entry"])(a0,a1,a2);var _wasmfs_create_file=(a0,a1,a2)=>(_wasmfs_create_file=wasmExports["wasmfs_create_file"])(a0,a1,a2);Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["wasmExports"]=wasmExports;Module["ccall"]=ccall;Module["FS_createPreloadedFile"]=FS_createPreloadedFile;Module["FS_unlink"]=FS_unlink;Module["FS_createPath"]=FS_createPath;Module["FS_createDataFile"]=FS_createDataFile;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); /** * Emscripten resolves `localhost` to a random IP address. Let's * make it always resolve to 127.0.0.1. diff --git a/packages/playground/wordpress/src/boot.ts b/packages/playground/wordpress/src/boot.ts index 111a0cd75f..97fc230717 100644 --- a/packages/playground/wordpress/src/boot.ts +++ b/packages/playground/wordpress/src/boot.ts @@ -182,6 +182,10 @@ export async function bootWordPress(options: BootOptions) { }); const php = await requestHandler.getPrimaryPhp(); + console.log(await php.mkdir('/wordpress')); + console.log(await php.listFiles('/')); + console.log((await php.run({ code: ' Date: Wed, 9 Oct 2024 23:03:40 +0200 Subject: [PATCH 2/2] Play with async fs functions --- packages/php-wasm/compile/php/Dockerfile | 1 - packages/php-wasm/compile/php/php_wasm.c | 59 +- .../php-wasm/universal/src/lib/fs-helpers.ts | 25 +- packages/php-wasm/universal/src/lib/php.ts | 18 +- .../web/public/php/jspi/8_0_30/php_8_0.wasm | Bin 12391870 -> 12391314 bytes .../php-wasm/web/public/php/jspi/php_8_0.js | 4355 ++++++++++++++++- packages/playground/wordpress/src/boot.ts | 18 +- 7 files changed, 4305 insertions(+), 171 deletions(-) diff --git a/packages/php-wasm/compile/php/Dockerfile b/packages/php-wasm/compile/php/Dockerfile index a14c8316b3..7f34bd6eec 100644 --- a/packages/php-wasm/compile/php/Dockerfile +++ b/packages/php-wasm/compile/php/Dockerfile @@ -930,7 +930,6 @@ RUN set -euxo pipefail; \ "_wasm_set_phpini_path", \n\ "_wasm_add_SERVER_entry", \n\ "_wasm_add_ENV_entry", \n\ -"_wasm_read", \n\ "_wasm_free", \n\ "_wasm_sapi_handle_request", \n\ "_wasm_sapi_request_shutdown", \n\ diff --git a/packages/php-wasm/compile/php/php_wasm.c b/packages/php-wasm/compile/php/php_wasm.c index 01c200573a..da6d2a8110 100644 --- a/packages/php-wasm/compile/php/php_wasm.c +++ b/packages/php-wasm/compile/php/php_wasm.c @@ -443,29 +443,6 @@ static size_t handle_line(int type, zval *array, char *buf, size_t bufl) return bufl; } -/** - * Shims read(2) functionallity. - * Enables reading from blocking pipes. By default, Emscripten - * will throw an EWOULDBLOCK error when trying to read from a - * blocking pipe. This function overrides that behavior and - * instead waits for the pipe to become readable. - * - * @see https://github.com/WordPress/wordpress-playground/issues/951 - * @see https://github.com/emscripten-core/emscripten/issues/13214 - */ -EMSCRIPTEN_KEEPALIVE ssize_t wasm_read(int fd, void *buf, size_t count) -{ - struct __wasi_iovec_t iov = { - .buf = buf, - .buf_len = count}; - size_t num; - if (__wasi_syscall_ret(js_fd_read(fd, &iov, 1, &num))) - { - return -1; - } - return num; -} - /* * If type==0, only last line of output is returned (exec) * If type==1, all lines will be printed and last lined returned (system) @@ -588,31 +565,6 @@ EMSCRIPTEN_KEEPALIVE int wasm_php_exec(int type, const char *cmd, zval *array, z int wasm_socket_has_data(php_socket_t fd); -/* hybrid select(2)/poll(2) for a single descriptor. - * timeouttv follows same rules as select(2), but is reduced to millisecond accuracy. - * Returns 0 on timeout, -1 on error, or the event mask (ala poll(2)). - */ -EMSCRIPTEN_KEEPALIVE inline int php_pollfd_for(php_socket_t fd, int events, struct timeval *timeouttv) -{ - php_pollfd p; - int n; - - p.fd = fd; - p.events = events; - p.revents = 0; - - // must yield back to JS event loop to get the network response: - wasm_poll_socket(fd, events, php_tvtoto(timeouttv)); - - n = php_poll2(&p, 1, php_tvtoto(timeouttv)); - - if (n > 0) - { - return p.revents; - } - - return n; -} ZEND_BEGIN_ARG_INFO_EX(arginfo_post_message_to_js, 0, 1, 1) ZEND_ARG_INFO(0, data) @@ -1737,6 +1689,17 @@ int php_wasm_init() backend_t opfs = wasmfs_create_opfs_backend(); err = wasmfs_create_directory("/internal", 0777, opfs); + backend_t opfs2 = wasmfs_create_opfs_backend(); + err = wasmfs_create_directory("/internal2", 0777, opfs2); + + FILE *file = fopen("/internal2/hi.txt", "w"); + if (file != NULL) { + fprintf(file, "Hello World"); + fclose(file); + } else { + fprintf(stderr, "Error creating file in /internal2/hi.txt\n"); + } + wasm_server_context = malloc(sizeof(wasm_server_context_t)); wasm_init_server_context(); diff --git a/packages/php-wasm/universal/src/lib/fs-helpers.ts b/packages/php-wasm/universal/src/lib/fs-helpers.ts index e41be6ec31..0eb52dfdac 100644 --- a/packages/php-wasm/universal/src/lib/fs-helpers.ts +++ b/packages/php-wasm/universal/src/lib/fs-helpers.ts @@ -63,7 +63,7 @@ export class FSHelpers { path: string, data: string | Uint8Array ) { - FS.writeFile(path, data); + return FS.writeFile(path, data); } /** @@ -159,12 +159,12 @@ export class FSHelpers { * @returns The list of files and directories in the given directory. */ @rethrowFileSystemError('Could not list files in "{path}"') - static listFiles( + static async listFiles( FS: Emscripten.RootFS, path: string, options: ListFilesOptions = { prependPath: false } - ): string[] { - if (!FSHelpers.fileExists(FS, path)) { + ): Promise { + if (!(await FSHelpers.fileExists(FS, path))) { return []; } try { @@ -190,8 +190,8 @@ export class FSHelpers { * @returns True if the path is a directory, false otherwise. */ @rethrowFileSystemError('Could not stat "{path}"') - static isDir(FS: Emscripten.RootFS, path: string): boolean { - if (!FSHelpers.fileExists(FS, path)) { + static async isDir(FS: Emscripten.RootFS, path: string): boolean { + if (!(await FSHelpers.fileExists(FS, path))) { return false; } return FS.isDir(FS.lookupPath(path, { follow: true }).node.mode); @@ -205,8 +205,8 @@ export class FSHelpers { * @returns True if the path is a file, false otherwise. */ @rethrowFileSystemError('Could not stat "{path}"') - static isFile(FS: Emscripten.RootFS, path: string): boolean { - if (!FSHelpers.fileExists(FS, path)) { + static async isFile(FS: Emscripten.RootFS, path: string): Promise { + if (!(await FSHelpers.fileExists(FS, path))) { return false; } return FS.isFile(FS.lookupPath(path, { follow: true }).node.mode); @@ -269,9 +269,12 @@ export class FSHelpers { * @returns True if the file exists, false otherwise. */ @rethrowFileSystemError('Could not stat "{path}"') - static fileExists(FS: Emscripten.RootFS, path: string): boolean { + static async fileExists( + FS: Emscripten.RootFS, + path: string + ): Promise { try { - FS.lookupPath(path); + await FS.lookupPath(path); return true; } catch (e) { return false; @@ -288,7 +291,7 @@ export class FSHelpers { */ @rethrowFileSystemError('Could not create directory "{path}"') static mkdir(FS: Emscripten.RootFS, path: string) { - FS.mkdirTree(path); + return FS.mkdirTree(path); } @rethrowFileSystemError('Could not copy files from "{path}"') diff --git a/packages/php-wasm/universal/src/lib/php.ts b/packages/php-wasm/universal/src/lib/php.ts index c59da6f3e7..ca73cf9f35 100644 --- a/packages/php-wasm/universal/src/lib/php.ts +++ b/packages/php-wasm/universal/src/lib/php.ts @@ -406,11 +406,11 @@ export class PHP implements Disposable { if (!this.#webSapiInitialized) { await this.#initWebRuntime(); this.#webSapiInitialized = true; - this.mkdir('/internal'); - this.mkdir('/internal/shared'); - this.mkdir('/internal/shared/preload'); + await this.mkdir('/internal'); + await this.mkdir('/internal/shared'); + await this.mkdir('/internal/shared/preload'); } - console.log(this.listFiles('/')); + console.log(await this.listFiles('/internal')); if (request.scriptPath && !this.fileExists(request.scriptPath)) { throw new Error( `The script path "${request.scriptPath}" does not exist.` @@ -432,7 +432,7 @@ export class PHP implements Disposable { heapBodyPointer = this.#setRequestBody(request.body); } if (typeof request.code === 'string') { - this.writeFile('/internal/eval.php', request.code); + await this.writeFile('/internal/eval.php', request.code); this.#setScriptPath('/internal/eval.php'); } else if (typeof request.scriptPath === 'string') { this.#setScriptPath(request.scriptPath || ''); @@ -535,14 +535,6 @@ export class PHP implements Disposable { httpStatusCode: number; } { const headersFilePath = '/internal/headers.json'; - setTimeout(() => { - console.log('Waa'); - console.log(this.listFiles('/')); - console.log(this.listFiles('/internal')); - console.log(this.listFiles('/wordpress')); - console.log(this.listFiles('/opfs')); - }, 1000); - console.log('Woo'); if (!this.fileExists(headersFilePath)) { return { headers: {}, httpStatusCode: 200 }; throw new Error( diff --git a/packages/php-wasm/web/public/php/jspi/8_0_30/php_8_0.wasm b/packages/php-wasm/web/public/php/jspi/8_0_30/php_8_0.wasm index 6ded6822aff8c898447f29caca2e5434c02e03ae..5454ea59410aaf138202a070937a2627f3fc438a 100755 GIT binary patch delta 2914087 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Ńpk|F7|~J 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

{(#Z*LTZTa=y-(At;Xz<~W)WDA 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