@zh-keyboard/pinyin 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/data/rime-api.js CHANGED
@@ -1,1957 +1,2 @@
1
- async function createRimeModule(moduleArg = {}) {
2
- let moduleRtn; const Module = moduleArg; const ENVIRONMENT_IS_WEB = !!globalThis.window; const ENVIRONMENT_IS_WORKER = !!globalThis.WorkerGlobalScope; const ENVIRONMENT_IS_NODE = globalThis.process?.versions?.node && globalThis.process?.type != 'renderer'; if (ENVIRONMENT_IS_NODE) {
3
- const { createRequire } = await import('node:module'); var require = createRequire(import.meta.url)
4
- } if (!Module.expectedDataFileDownloads)
5
- Module.expectedDataFileDownloads = 0; Module.expectedDataFileDownloads++; (() => {
6
- const isPthread = typeof ENVIRONMENT_IS_PTHREAD != 'undefined' && ENVIRONMENT_IS_PTHREAD; const isWasmWorker = typeof ENVIRONMENT_IS_WASM_WORKER != 'undefined' && ENVIRONMENT_IS_WASM_WORKER; if (isPthread || isWasmWorker)
7
- return; const isNode = globalThis.process && globalThis.process.versions && globalThis.process.versions.node && globalThis.process.type != 'renderer'; async function loadPackage(metadata) {
8
- let PACKAGE_PATH = ''; if (typeof window === 'object') {
9
- PACKAGE_PATH = window.encodeURIComponent(`${window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/'))}/`)
10
- } else if (typeof process === 'undefined' && typeof location !== 'undefined') {
11
- PACKAGE_PATH = encodeURIComponent(`${location.pathname.substring(0, location.pathname.lastIndexOf('/'))}/`)
12
- } const PACKAGE_NAME = '/home/zzx/work/librime/wasm/dist/rime-api.data'; const REMOTE_PACKAGE_BASE = 'rime-api.data'; const REMOTE_PACKAGE_NAME = Module.locateFile ? Module.locateFile(REMOTE_PACKAGE_BASE, '') : REMOTE_PACKAGE_BASE; const REMOTE_PACKAGE_SIZE = metadata.remote_package_size; async function fetchRemotePackage(packageName, packageSize) {
13
- if (isNode) {
14
- const contents = require('node:fs').readFileSync(packageName); return new Uint8Array(contents).buffer
15
- } if (!Module.dataFileDownloads)
16
- Module.dataFileDownloads = {}; try {
17
- var response = await fetch(packageName)
18
- } catch (e) {
19
- throw new Error(`Network Error: ${packageName}`, { e })
20
- } if (!response.ok) {
21
- throw new Error(`${response.status}: ${response.url}`)
22
- } const chunks = []; const headers = response.headers; const total = Number(headers.get('Content-Length') || packageSize); let loaded = 0; Module.setStatus && Module.setStatus('Downloading data...'); const reader = response.body.getReader(); while (1) {
23
- const { done, value } = await reader.read(); if (done)
24
- break; chunks.push(value); loaded += value.length; Module.dataFileDownloads[packageName] = { loaded, total }; let totalLoaded = 0; let totalSize = 0; for (const download of Object.values(Module.dataFileDownloads)) {
25
- totalLoaded += download.loaded; totalSize += download.total
26
- }Module.setStatus && Module.setStatus(`Downloading data... (${totalLoaded}/${totalSize})`)
27
- } const packageData = new Uint8Array(chunks.map(c => c.length).reduce((a, b) => a + b, 0)); let offset = 0; for (const chunk of chunks) {
28
- packageData.set(chunk, offset); offset += chunk.length
29
- } return packageData.buffer
30
- } let fetchPromise; let fetched = Module.getPreloadedPackage && Module.getPreloadedPackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE); if (!fetched) {
31
- fetchPromise = fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE)
32
- } async function runWithFS(Module) {
33
- function assert(check, msg) {
34
- if (!check)
35
- throw new Error(msg)
36
- }Module.FS_createPath('/', 'rime', true, true); Module.FS_createPath('/rime', 'opencc', true, true); for (const file of metadata.files) {
37
- const name = file.filename; Module.addRunDependency(`fp ${name}`)
38
- } async function processPackageData(arrayBuffer) {
39
- assert(arrayBuffer, 'Loading data file failed.'); assert(arrayBuffer.constructor.name === ArrayBuffer.name, `bad input to processPackageData ${arrayBuffer.constructor.name}`); const byteArray = new Uint8Array(arrayBuffer); for (const file of metadata.files) {
40
- const name = file.filename; const data = byteArray.subarray(file.start, file.end); Module.FS_createDataFile(name, null, data, true, true, true); Module.removeRunDependency(`fp ${name}`)
41
- }Module.removeRunDependency('datafile_/home/zzx/work/librime/wasm/dist/rime-api.data')
42
- }Module.addRunDependency('datafile_/home/zzx/work/librime/wasm/dist/rime-api.data'); if (!Module.preloadResults)
43
- Module.preloadResults = {}; Module.preloadResults[PACKAGE_NAME] = { fromCache: false }; if (!fetched) {
44
- fetched = await fetchPromise
45
- }processPackageData(fetched)
46
- } if (Module.calledRun) {
47
- runWithFS(Module)
48
- } else {
49
- if (!Module.preRun)
50
- Module.preRun = []; Module.preRun.push(runWithFS)
51
- }
52
- }loadPackage({ files: [{ filename: '/rime/opencc/STCharacters.ocd2', start: 0, end: 45310 }, { filename: '/rime/opencc/STPhrases.ocd2', start: 45310, end: 971027 }, { filename: '/rime/opencc/TSCharacters.ocd2', start: 971027, end: 1017153 }, { filename: '/rime/opencc/TSPhrases.ocd2', start: 1017153, end: 1026935 }, { filename: '/rime/opencc/s2t.json', start: 1026935, end: 1027341 }, { filename: '/rime/opencc/t2s.json', start: 1027341, end: 1027747 }], remote_package_size: 1027747 })
53
- })(); let arguments_ = []; let thisProgram = './this.program'; let quit_ = (status, toThrow) => {
54
- throw toThrow
55
- }; const _scriptName = import.meta.url; let scriptDirectory = ''; function locateFile(path) {
56
- if (Module.locateFile) {
57
- return Module.locateFile(path, scriptDirectory)
58
- } return scriptDirectory + path
59
- } let readAsync, readBinary; if (ENVIRONMENT_IS_NODE) {
60
- var fs = require('node:fs'); if (_scriptName.startsWith('file:')) {
61
- scriptDirectory = `${require('node:path').dirname(require('node:url').fileURLToPath(_scriptName))}/`
62
- }readBinary = (filename) => {
63
- filename = isFileURI(filename) ? new URL(filename) : filename; const ret = fs.readFileSync(filename); return ret
64
- }; readAsync = async (filename, binary = true) => {
65
- filename = isFileURI(filename) ? new URL(filename) : filename; const ret = fs.readFileSync(filename, binary ? undefined : 'utf8'); return ret
66
- }; if (process.argv.length > 1) {
67
- thisProgram = process.argv[1].replace(/\\/g, '/')
68
- }arguments_ = process.argv.slice(2); quit_ = (status, toThrow) => {
69
- process.exitCode = status; throw toThrow
70
- }
71
- } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
72
- try {
73
- scriptDirectory = new URL('.', _scriptName).href
74
- } catch {} { if (ENVIRONMENT_IS_WORKER) {
75
- readBinary = (url) => {
76
- const xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.responseType = 'arraybuffer'; xhr.send(null); return new Uint8Array(xhr.response)
77
- }
78
- }readAsync = async (url) => {
79
- if (isFileURI(url)) {
80
- return new Promise((resolve, reject) => {
81
- const xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = () => {
82
- if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
83
- resolve(xhr.response); return
84
- }reject(xhr.status)
85
- }; xhr.onerror = reject; xhr.send(null)
86
- })
87
- } const response = await fetch(url, { credentials: 'same-origin' }); if (response.ok) {
88
- return response.arrayBuffer()
89
- } throw new Error(`${response.status} : ${response.url}`)
90
- } }
91
- } else {} let out = console.log.bind(console); let err = console.error.bind(console); let wasmBinary; let ABORT = false; let EXITSTATUS; var isFileURI = filename => filename.startsWith('file://'); let readyPromiseResolve, readyPromiseReject; let HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; let HEAP64, HEAPU64; let runtimeInitialized = false; function updateMemoryViews() {
92
- const b = wasmMemory.buffer; HEAP8 = new Int8Array(b); HEAP16 = new Int16Array(b); HEAPU8 = new Uint8Array(b); HEAPU16 = new Uint16Array(b); HEAP32 = new Int32Array(b); HEAPU32 = new Uint32Array(b); HEAPF32 = new Float32Array(b); HEAPF64 = new Float64Array(b); HEAP64 = new BigInt64Array(b); HEAPU64 = new BigUint64Array(b)
93
- } function preRun() {
94
- if (Module.preRun) {
95
- if (typeof Module.preRun == 'function')
96
- Module.preRun = [Module.preRun]; while (Module.preRun.length) {
97
- addOnPreRun(Module.preRun.shift())
98
- }
99
- }callRuntimeCallbacks(onPreRuns)
100
- } function initRuntime() {
101
- runtimeInitialized = true; if (!Module.noFSInit && !FS.initialized)
102
- FS.init(); TTY.init(); wasmExports.Q(); FS.ignorePermissions = false
103
- } function postRun() {
104
- if (Module.postRun) {
105
- if (typeof Module.postRun == 'function')
106
- Module.postRun = [Module.postRun]; while (Module.postRun.length) {
107
- addOnPostRun(Module.postRun.shift())
108
- }
109
- }callRuntimeCallbacks(onPostRuns)
110
- } function abort(what) {
111
- Module.onAbort?.(what); what = `Aborted(${what})`; err(what); ABORT = true; what += '. Build with -sASSERTIONS for more info.'; if (runtimeInitialized) {
112
- ___trap()
113
- } const e = new WebAssembly.RuntimeError(what); readyPromiseReject?.(e); throw e
114
- } let wasmBinaryFile; function findWasmBinary() {
115
- if (Module.locateFile) {
116
- return locateFile('rime-api.wasm')
117
- } return new URL('rime-api.wasm', import.meta.url).href
118
- } function getBinarySync(file) {
119
- if (file == wasmBinaryFile && wasmBinary) {
120
- return new Uint8Array(wasmBinary)
121
- } if (readBinary) {
122
- return readBinary(file)
123
- } throw 'both async and sync fetching of the wasm failed'
124
- } async function getWasmBinary(binaryFile) {
125
- if (!wasmBinary) {
126
- try {
127
- const response = await readAsync(binaryFile); return new Uint8Array(response)
128
- } catch {}
129
- } return getBinarySync(binaryFile)
130
- } async function instantiateArrayBuffer(binaryFile, imports) {
131
- try {
132
- const binary = await getWasmBinary(binaryFile); const instance = await WebAssembly.instantiate(binary, imports); return instance
133
- } catch (reason) {
134
- err(`failed to asynchronously prepare wasm: ${reason}`); abort(reason)
135
- }
136
- } async function instantiateAsync(binary, binaryFile, imports) {
137
- if (!binary && !isFileURI(binaryFile) && !ENVIRONMENT_IS_NODE) {
138
- try {
139
- const response = fetch(binaryFile, { credentials: 'same-origin' }); const instantiationResult = await WebAssembly.instantiateStreaming(response, imports); return instantiationResult
140
- } catch (reason) {
141
- err(`wasm streaming compile failed: ${reason}`); err('falling back to ArrayBuffer instantiation')
142
- }
143
- } return instantiateArrayBuffer(binaryFile, imports)
144
- } function getWasmImports() {
145
- const imports = { a: wasmImports }; return imports
146
- } async function createWasm() {
147
- function receiveInstance(instance, module) {
148
- wasmExports = instance.exports; wasmExports = applySignatureConversions(wasmExports); assignWasmExports(wasmExports); updateMemoryViews(); return wasmExports
149
- } function receiveInstantiationResult(result) {
150
- return receiveInstance(result.instance)
151
- } const info = getWasmImports(); if (Module.instantiateWasm) {
152
- return new Promise((resolve, reject) => {
153
- Module.instantiateWasm(info, (inst, mod) => {
154
- resolve(receiveInstance(inst, mod))
155
- })
156
- })
157
- }wasmBinaryFile ??= findWasmBinary(); const result = await instantiateAsync(wasmBinary, wasmBinaryFile, info); const exports = receiveInstantiationResult(result); return exports
158
- } class ExitStatus {
159
- name = 'ExitStatus'; constructor(status) {
160
- this.message = `Program terminated with exit(${status})`; this.status = status
161
- }
162
- } var callRuntimeCallbacks = (callbacks) => {
163
- while (callbacks.length > 0) {
164
- callbacks.shift()(Module)
165
- }
166
- }; var onPostRuns = []; var addOnPostRun = cb => onPostRuns.push(cb); var onPreRuns = []; var addOnPreRun = cb => onPreRuns.push(cb); let noExitRuntime = true; var PATH = { isAbs: path => path.charAt(0) === '/', splitPath: (filename) => {
167
- const splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^/]+?)?(\.[^./]*|))\/*$/; return splitPathRe.exec(filename).slice(1)
168
- }, normalizeArray: (parts, allowAboveRoot) => {
169
- let up = 0; for (let i = parts.length - 1; i >= 0; i--) {
170
- const last = parts[i]; if (last === '.') {
171
- parts.splice(i, 1)
172
- } else if (last === '..') {
173
- parts.splice(i, 1); up++
174
- } else if (up) {
175
- parts.splice(i, 1); up--
176
- }
177
- } if (allowAboveRoot) {
178
- for (;up; up--) {
179
- parts.unshift('..')
180
- }
181
- } return parts
182
- }, normalize: (path) => {
183
- const isAbsolute = PATH.isAbs(path); const trailingSlash = path.slice(-1) === '/'; path = PATH.normalizeArray(path.split('/').filter(p => !!p), !isAbsolute).join('/'); if (!path && !isAbsolute) {
184
- path = '.'
185
- } if (path && trailingSlash) {
186
- path += '/'
187
- } return (isAbsolute ? '/' : '') + path
188
- }, dirname: (path) => {
189
- const result = PATH.splitPath(path); const root = result[0]; let dir = result[1]; if (!root && !dir) {
190
- return '.'
191
- } if (dir) {
192
- dir = dir.slice(0, -1)
193
- } return root + dir
194
- }, basename: path => path && path.match(/([^/]+|\/)\/*$/)[1], join: (...paths) => PATH.normalize(paths.join('/')), join2: (l, r) => PATH.normalize(`${l}/${r}`) }; const initRandomFill = () => {
195
- if (ENVIRONMENT_IS_NODE) {
196
- const nodeCrypto = require('node:crypto'); return view => nodeCrypto.randomFillSync(view)
197
- } return view => crypto.getRandomValues(view)
198
- }; let randomFill = (view) => {
199
- (randomFill = initRandomFill())(view)
200
- }; var PATH_FS = { resolve: (...args) => {
201
- let resolvedPath = ''; let resolvedAbsolute = false; for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
202
- const path = i >= 0 ? args[i] : FS.cwd(); if (typeof path != 'string') {
203
- throw new TypeError('Arguments to path.resolve must be strings')
204
- } else if (!path) {
205
- return ''
206
- }resolvedPath = `${path}/${resolvedPath}`; resolvedAbsolute = PATH.isAbs(path)
207
- }resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(p => !!p), !resolvedAbsolute).join('/'); return (resolvedAbsolute ? '/' : '') + resolvedPath || '.'
208
- }, relative: (from, to) => {
209
- from = PATH_FS.resolve(from).slice(1); to = PATH_FS.resolve(to).slice(1); function trim(arr) {
210
- let start = 0; for (;start < arr.length; start++) {
211
- if (arr[start] !== '')
212
- break
213
- } let end = arr.length - 1; for (;end >= 0; end--) {
214
- if (arr[end] !== '')
215
- break
216
- } if (start > end)
217
- return []; return arr.slice(start, end - start + 1)
218
- } const fromParts = trim(from.split('/')); const toParts = trim(to.split('/')); const length = Math.min(fromParts.length, toParts.length); let samePartsLength = length; for (var i = 0; i < length; i++) {
219
- if (fromParts[i] !== toParts[i]) {
220
- samePartsLength = i; break
221
- }
222
- } let outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) {
223
- outputParts.push('..')
224
- }outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join('/')
225
- } }; const UTF8Decoder = new TextDecoder(); const findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => {
226
- const maxIdx = idx + maxBytesToRead; if (ignoreNul)
227
- return maxIdx; while (heapOrArray[idx] && !(idx >= maxIdx))++idx; return idx
228
- }; const UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => {
229
- idx >>>= 0; const endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul); return UTF8Decoder.decode(heapOrArray.buffer ? heapOrArray.subarray(idx, endPtr) : new Uint8Array(heapOrArray.slice(idx, endPtr)))
230
- }; let FS_stdin_getChar_buffer = []; const lengthBytesUTF8 = (str) => {
231
- let len = 0; for (let i = 0; i < str.length; ++i) {
232
- const c = str.charCodeAt(i); if (c <= 127) {
233
- len++
234
- } else if (c <= 2047) {
235
- len += 2
236
- } else if (c >= 55296 && c <= 57343) {
237
- len += 4; ++i
238
- } else {
239
- len += 3
240
- }
241
- } return len
242
- }; const stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
243
- outIdx >>>= 0; if (!(maxBytesToWrite > 0))
244
- return 0; const startIdx = outIdx; const endIdx = outIdx + maxBytesToWrite - 1; for (let i = 0; i < str.length; ++i) {
245
- const u = str.codePointAt(i); if (u <= 127) {
246
- if (outIdx >= endIdx)
247
- break; heap[outIdx++ >>> 0] = u
248
- } else if (u <= 2047) {
249
- if (outIdx + 1 >= endIdx)
250
- break; heap[outIdx++ >>> 0] = 192 | u >> 6; heap[outIdx++ >>> 0] = 128 | u & 63
251
- } else if (u <= 65535) {
252
- if (outIdx + 2 >= endIdx)
253
- break; heap[outIdx++ >>> 0] = 224 | u >> 12; heap[outIdx++ >>> 0] = 128 | u >> 6 & 63; heap[outIdx++ >>> 0] = 128 | u & 63
254
- } else {
255
- if (outIdx + 3 >= endIdx)
256
- break; heap[outIdx++ >>> 0] = 240 | u >> 18; heap[outIdx++ >>> 0] = 128 | u >> 12 & 63; heap[outIdx++ >>> 0] = 128 | u >> 6 & 63; heap[outIdx++ >>> 0] = 128 | u & 63; i++
257
- }
258
- }heap[outIdx >>> 0] = 0; return outIdx - startIdx
259
- }; const intArrayFromString = (stringy, dontAddNull, length) => {
260
- const len = length > 0 ? length : lengthBytesUTF8(stringy) + 1; const u8array = new Array(len); const numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); if (dontAddNull)
261
- u8array.length = numBytesWritten; return u8array
262
- }; const FS_stdin_getChar = () => {
263
- if (!FS_stdin_getChar_buffer.length) {
264
- let result = null; if (ENVIRONMENT_IS_NODE) {
265
- const BUFSIZE = 256; const buf = Buffer.alloc(BUFSIZE); let bytesRead = 0; const fd = process.stdin.fd; try {
266
- bytesRead = fs.readSync(fd, buf, 0, BUFSIZE)
267
- } catch (e) {
268
- if (e.toString().includes('EOF'))
269
- bytesRead = 0; else throw e
270
- } if (bytesRead > 0) {
271
- result = buf.slice(0, bytesRead).toString('utf-8')
272
- }
273
- } else if (globalThis.window?.prompt) {
274
- result = window.prompt('Input: '); if (result !== null) {
275
- result += '\n'
276
- }
277
- } else {} if (!result) {
278
- return null
279
- }FS_stdin_getChar_buffer = intArrayFromString(result, true)
280
- } return FS_stdin_getChar_buffer.shift()
281
- }; var TTY = { ttys: [], init() {}, shutdown() {}, register(dev, ops) {
282
- TTY.ttys[dev] = { input: [], output: [], ops }; FS.registerDevice(dev, TTY.stream_ops)
283
- }, stream_ops: { open(stream) {
284
- const tty = TTY.ttys[stream.node.rdev]; if (!tty) {
285
- throw new FS.ErrnoError(43)
286
- }stream.tty = tty; stream.seekable = false
287
- }, close(stream) {
288
- stream.tty.ops.fsync(stream.tty)
289
- }, fsync(stream) {
290
- stream.tty.ops.fsync(stream.tty)
291
- }, read(stream, buffer, offset, length, pos) {
292
- if (!stream.tty || !stream.tty.ops.get_char) {
293
- throw new FS.ErrnoError(60)
294
- } let bytesRead = 0; for (let i = 0; i < length; i++) {
295
- var result; try {
296
- result = stream.tty.ops.get_char(stream.tty)
297
- } catch (e) {
298
- throw new FS.ErrnoError(29)
299
- } if (result === undefined && bytesRead === 0) {
300
- throw new FS.ErrnoError(6)
301
- } if (result === null || result === undefined)
302
- break; bytesRead++; buffer[offset + i] = result
303
- } if (bytesRead) {
304
- stream.node.atime = Date.now()
305
- } return bytesRead
306
- }, write(stream, buffer, offset, length, pos) {
307
- if (!stream.tty || !stream.tty.ops.put_char) {
308
- throw new FS.ErrnoError(60)
309
- } try {
310
- for (var i = 0; i < length; i++) {
311
- stream.tty.ops.put_char(stream.tty, buffer[offset + i])
312
- }
313
- } catch (e) {
314
- throw new FS.ErrnoError(29)
315
- } if (length) {
316
- stream.node.mtime = stream.node.ctime = Date.now()
317
- } return i
318
- } }, default_tty_ops: { get_char(tty) {
319
- return FS_stdin_getChar()
320
- }, put_char(tty, val) {
321
- if (val === null || val === 10) {
322
- out(UTF8ArrayToString(tty.output)); tty.output = []
323
- } else {
324
- if (val != 0)
325
- tty.output.push(val)
326
- }
327
- }, fsync(tty) {
328
- if (tty.output?.length > 0) {
329
- out(UTF8ArrayToString(tty.output)); tty.output = []
330
- }
331
- }, ioctl_tcgets(tty) {
332
- 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] }
333
- }, ioctl_tcsets(tty, optional_actions, data) {
334
- return 0
335
- }, ioctl_tiocgwinsz(tty) {
336
- return [24, 80]
337
- } }, default_tty1_ops: { put_char(tty, val) {
338
- if (val === null || val === 10) {
339
- err(UTF8ArrayToString(tty.output)); tty.output = []
340
- } else {
341
- if (val != 0)
342
- tty.output.push(val)
343
- }
344
- }, fsync(tty) {
345
- if (tty.output?.length > 0) {
346
- err(UTF8ArrayToString(tty.output)); tty.output = []
347
- }
348
- } } }; const zeroMemory = (ptr, size) => HEAPU8.fill(0, ptr, ptr + size); const alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment; const mmapAlloc = (size) => {
349
- size = alignMemory(size, 65536); const ptr = _emscripten_builtin_memalign(65536, size); if (ptr)
350
- zeroMemory(ptr, size); return ptr
351
- }; var MEMFS = { ops_table: null, mount(mount) {
352
- return MEMFS.createNode(null, '/', 16895, 0)
353
- }, createNode(parent, name, mode, dev) {
354
- if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
355
- throw new FS.ErrnoError(63)
356
- }MEMFS.ops_table ||= { dir: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, lookup: MEMFS.node_ops.lookup, mknod: MEMFS.node_ops.mknod, rename: MEMFS.node_ops.rename, unlink: MEMFS.node_ops.unlink, rmdir: MEMFS.node_ops.rmdir, readdir: MEMFS.node_ops.readdir, symlink: MEMFS.node_ops.symlink }, stream: { llseek: MEMFS.stream_ops.llseek } }, file: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr }, stream: { llseek: MEMFS.stream_ops.llseek, read: MEMFS.stream_ops.read, write: MEMFS.stream_ops.write, mmap: MEMFS.stream_ops.mmap, msync: MEMFS.stream_ops.msync } }, link: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, readlink: MEMFS.node_ops.readlink }, stream: {} }, chrdev: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr }, stream: FS.chrdev_stream_ops } }; const node = FS.createNode(parent, name, mode, dev); if (FS.isDir(node.mode)) {
357
- node.node_ops = MEMFS.ops_table.dir.node; node.stream_ops = MEMFS.ops_table.dir.stream; node.contents = {}
358
- } else if (FS.isFile(node.mode)) {
359
- node.node_ops = MEMFS.ops_table.file.node; node.stream_ops = MEMFS.ops_table.file.stream; node.usedBytes = 0; node.contents = null
360
- } else if (FS.isLink(node.mode)) {
361
- node.node_ops = MEMFS.ops_table.link.node; node.stream_ops = MEMFS.ops_table.link.stream
362
- } else if (FS.isChrdev(node.mode)) {
363
- node.node_ops = MEMFS.ops_table.chrdev.node; node.stream_ops = MEMFS.ops_table.chrdev.stream
364
- }node.atime = node.mtime = node.ctime = Date.now(); if (parent) {
365
- parent.contents[name] = node; parent.atime = parent.mtime = parent.ctime = node.atime
366
- } return node
367
- }, getFileDataAsTypedArray(node) {
368
- if (!node.contents)
369
- return new Uint8Array(0); if (node.contents.subarray)
370
- return node.contents.subarray(0, node.usedBytes); return new Uint8Array(node.contents)
371
- }, expandFileStorage(node, newCapacity) {
372
- const prevCapacity = node.contents ? node.contents.length : 0; if (prevCapacity >= newCapacity)
373
- return; const CAPACITY_DOUBLING_MAX = 1024 * 1024; newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) >>> 0); if (prevCapacity != 0)
374
- newCapacity = Math.max(newCapacity, 256); const oldContents = node.contents; node.contents = new Uint8Array(newCapacity); if (node.usedBytes > 0)
375
- node.contents.set(oldContents.subarray(0, node.usedBytes), 0)
376
- }, resizeFileStorage(node, newSize) {
377
- if (node.usedBytes == newSize)
378
- return; if (newSize == 0) {
379
- node.contents = null; node.usedBytes = 0
380
- } else {
381
- const oldContents = node.contents; node.contents = new Uint8Array(newSize); if (oldContents) {
382
- node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes)))
383
- }node.usedBytes = newSize
384
- }
385
- }, node_ops: { getattr(node) {
386
- const 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)) {
387
- attr.size = 4096
388
- } else if (FS.isFile(node.mode)) {
389
- attr.size = node.usedBytes
390
- } else if (FS.isLink(node.mode)) {
391
- attr.size = node.link.length
392
- } else {
393
- attr.size = 0
394
- }attr.atime = new Date(node.atime); attr.mtime = new Date(node.mtime); attr.ctime = new Date(node.ctime); attr.blksize = 4096; attr.blocks = Math.ceil(attr.size / attr.blksize); return attr
395
- }, setattr(node, attr) {
396
- for (const key of ['mode', 'atime', 'mtime', 'ctime']) {
397
- if (attr[key] != null) {
398
- node[key] = attr[key]
399
- }
400
- } if (attr.size !== undefined) {
401
- MEMFS.resizeFileStorage(node, attr.size)
402
- }
403
- }, lookup(parent, name) {
404
- if (!MEMFS.doesNotExistError) {
405
- MEMFS.doesNotExistError = new FS.ErrnoError(44); MEMFS.doesNotExistError.stack = '<generic error, no stack>'
406
- } throw MEMFS.doesNotExistError
407
- }, mknod(parent, name, mode, dev) {
408
- return MEMFS.createNode(parent, name, mode, dev)
409
- }, rename(old_node, new_dir, new_name) {
410
- let new_node; try {
411
- new_node = FS.lookupNode(new_dir, new_name)
412
- } catch (e) {} if (new_node) {
413
- if (FS.isDir(old_node.mode)) {
414
- for (const i in new_node.contents) {
415
- throw new FS.ErrnoError(55)
416
- }
417
- }FS.hashRemoveNode(new_node)
418
- } delete old_node.parent.contents[old_node.name]; new_dir.contents[new_name] = old_node; old_node.name = new_name; new_dir.ctime = new_dir.mtime = old_node.parent.ctime = old_node.parent.mtime = Date.now()
419
- }, unlink(parent, name) {
420
- delete parent.contents[name]; parent.ctime = parent.mtime = Date.now()
421
- }, rmdir(parent, name) {
422
- const node = FS.lookupNode(parent, name); for (const i in node.contents) {
423
- throw new FS.ErrnoError(55)
424
- } delete parent.contents[name]; parent.ctime = parent.mtime = Date.now()
425
- }, readdir(node) {
426
- return ['.', '..', ...Object.keys(node.contents)]
427
- }, symlink(parent, newname, oldpath) {
428
- const node = MEMFS.createNode(parent, newname, 511 | 40960, 0); node.link = oldpath; return node
429
- }, readlink(node) {
430
- if (!FS.isLink(node.mode)) {
431
- throw new FS.ErrnoError(28)
432
- } return node.link
433
- } }, stream_ops: { read(stream, buffer, offset, length, position) {
434
- const contents = stream.node.contents; if (position >= stream.node.usedBytes)
435
- return 0; const size = Math.min(stream.node.usedBytes - position, length); if (size > 8 && contents.subarray) {
436
- buffer.set(contents.subarray(position, position + size), offset)
437
- } else {
438
- for (let i = 0; i < size; i++)buffer[offset + i] = contents[position + i]
439
- } return size
440
- }, write(stream, buffer, offset, length, position, canOwn) {
441
- if (buffer.buffer === HEAP8.buffer) {
442
- canOwn = false
443
- } if (!length)
444
- return 0; const node = stream.node; node.mtime = node.ctime = Date.now(); if (buffer.subarray && (!node.contents || node.contents.subarray)) {
445
- if (canOwn) {
446
- node.contents = buffer.subarray(offset, offset + length); node.usedBytes = length; return length
447
- } else if (node.usedBytes === 0 && position === 0) {
448
- node.contents = buffer.slice(offset, offset + length); node.usedBytes = length; return length
449
- } else if (position + length <= node.usedBytes) {
450
- node.contents.set(buffer.subarray(offset, offset + length), position); return length
451
- }
452
- }MEMFS.expandFileStorage(node, position + length); if (node.contents.subarray && buffer.subarray) {
453
- node.contents.set(buffer.subarray(offset, offset + length), position)
454
- } else {
455
- for (let i = 0; i < length; i++) {
456
- node.contents[position + i] = buffer[offset + i]
457
- }
458
- }node.usedBytes = Math.max(node.usedBytes, position + length); return length
459
- }, llseek(stream, offset, whence) {
460
- let position = offset; if (whence === 1) {
461
- position += stream.position
462
- } else if (whence === 2) {
463
- if (FS.isFile(stream.node.mode)) {
464
- position += stream.node.usedBytes
465
- }
466
- } if (position < 0) {
467
- throw new FS.ErrnoError(28)
468
- } return position
469
- }, mmap(stream, length, position, prot, flags) {
470
- if (!FS.isFile(stream.node.mode)) {
471
- throw new FS.ErrnoError(43)
472
- } let ptr; let allocated; let contents = stream.node.contents; if (!(flags & 2) && contents && contents.buffer === HEAP8.buffer) {
473
- allocated = false; ptr = contents.byteOffset
474
- } else {
475
- allocated = true; ptr = mmapAlloc(length); if (!ptr) {
476
- throw new FS.ErrnoError(48)
477
- } if (contents) {
478
- if (position > 0 || position + length < contents.length) {
479
- if (contents.subarray) {
480
- contents = contents.subarray(position, position + length)
481
- } else {
482
- contents = Array.prototype.slice.call(contents, position, position + length)
483
- }
484
- }HEAP8.set(contents, ptr >>> 0)
485
- }
486
- } return { ptr, allocated }
487
- }, msync(stream, buffer, offset, length, mmapFlags) {
488
- MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); return 0
489
- } } }; const FS_modeStringToFlags = (str) => {
490
- const flagModes = { 'r': 0, 'r+': 2, 'w': 512 | 64 | 1, 'w+': 512 | 64 | 2, 'a': 1024 | 64 | 1, 'a+': 1024 | 64 | 2 }; const flags = flagModes[str]; if (typeof flags == 'undefined') {
491
- throw new TypeError(`Unknown file open mode: ${str}`)
492
- } return flags
493
- }; const FS_getMode = (canRead, canWrite) => {
494
- let mode = 0; if (canRead)
495
- mode |= 292 | 73; if (canWrite)
496
- mode |= 146; return mode
497
- }; var IDBFS = { dbs: {}, indexedDB: () => indexedDB, DB_VERSION: 21, DB_STORE_NAME: 'FILE_DATA', queuePersist: (mount) => {
498
- function onPersistComplete() {
499
- if (mount.idbPersistState === 'again')
500
- startPersist(); else mount.idbPersistState = 0
501
- } function startPersist() {
502
- mount.idbPersistState = 'idb'; IDBFS.syncfs(mount, false, onPersistComplete)
503
- } if (!mount.idbPersistState) {
504
- mount.idbPersistState = setTimeout(startPersist, 0)
505
- } else if (mount.idbPersistState === 'idb') {
506
- mount.idbPersistState = 'again'
507
- }
508
- }, mount: (mount) => {
509
- const mnt = MEMFS.mount(mount); if (mount?.opts?.autoPersist) {
510
- mount.idbPersistState = 0; const memfs_node_ops = mnt.node_ops; mnt.node_ops = { ...mnt.node_ops }; mnt.node_ops.mknod = (parent, name, mode, dev) => {
511
- const node = memfs_node_ops.mknod(parent, name, mode, dev); node.node_ops = mnt.node_ops; node.idbfs_mount = mnt.mount; node.memfs_stream_ops = node.stream_ops; node.stream_ops = { ...node.stream_ops }; node.stream_ops.write = (stream, buffer, offset, length, position, canOwn) => {
512
- stream.node.isModified = true; return node.memfs_stream_ops.write(stream, buffer, offset, length, position, canOwn)
513
- }; node.stream_ops.close = (stream) => {
514
- const n = stream.node; if (n.isModified) {
515
- IDBFS.queuePersist(n.idbfs_mount); n.isModified = false
516
- } if (n.memfs_stream_ops.close)
517
- return n.memfs_stream_ops.close(stream)
518
- }; IDBFS.queuePersist(mnt.mount); return node
519
- }; mnt.node_ops.rmdir = (...args) => (IDBFS.queuePersist(mnt.mount), memfs_node_ops.rmdir(...args)); mnt.node_ops.symlink = (...args) => (IDBFS.queuePersist(mnt.mount), memfs_node_ops.symlink(...args)); mnt.node_ops.unlink = (...args) => (IDBFS.queuePersist(mnt.mount), memfs_node_ops.unlink(...args)); mnt.node_ops.rename = (...args) => (IDBFS.queuePersist(mnt.mount), memfs_node_ops.rename(...args))
520
- } return mnt
521
- }, syncfs: (mount, populate, callback) => {
522
- IDBFS.getLocalSet(mount, (err, local) => {
523
- if (err)
524
- return callback(err); IDBFS.getRemoteSet(mount, (err, remote) => {
525
- if (err)
526
- return callback(err); const src = populate ? remote : local; const dst = populate ? local : remote; IDBFS.reconcile(src, dst, callback)
527
- })
528
- })
529
- }, quit: () => {
530
- for (const value of Object.values(IDBFS.dbs)) {
531
- value.close()
532
- }IDBFS.dbs = {}
533
- }, getDB: (name, callback) => {
534
- let db = IDBFS.dbs[name]; if (db) {
535
- return callback(null, db)
536
- } let req; try {
537
- req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION)
538
- } catch (e) {
539
- return callback(e)
540
- } if (!req) {
541
- return callback('Unable to connect to IndexedDB')
542
- }req.onupgradeneeded = (e) => {
543
- const db = e.target.result; const transaction = e.target.transaction; let fileStore; if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {
544
- fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME)
545
- } else {
546
- fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME)
547
- } if (!fileStore.indexNames.contains('timestamp')) {
548
- fileStore.createIndex('timestamp', 'timestamp', { unique: false })
549
- }
550
- }; req.onsuccess = () => {
551
- db = req.result; IDBFS.dbs[name] = db; callback(null, db)
552
- }; req.onerror = (e) => {
553
- callback(e.target.error); e.preventDefault()
554
- }
555
- }, getLocalSet: (mount, callback) => {
556
- const entries = {}; function isRealDir(p) {
557
- return p !== '.' && p !== '..'
558
- } function toAbsolute(root) {
559
- return p => PATH.join2(root, p)
560
- } const check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint)); while (check.length) {
561
- const path = check.pop(); var stat; try {
562
- stat = FS.stat(path)
563
- } catch (e) {
564
- return callback(e)
565
- } if (FS.isDir(stat.mode)) {
566
- check.push(...FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))
567
- }entries[path] = { timestamp: stat.mtime }
568
- } return callback(null, { type: 'local', entries })
569
- }, getRemoteSet: (mount, callback) => {
570
- const entries = {}; IDBFS.getDB(mount.mountpoint, (err, db) => {
571
- if (err)
572
- return callback(err); try {
573
- const transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly'); transaction.onerror = (e) => {
574
- callback(e.target.error); e.preventDefault()
575
- }; const store = transaction.objectStore(IDBFS.DB_STORE_NAME); const index = store.index('timestamp'); index.openKeyCursor().onsuccess = (event) => {
576
- const cursor = event.target.result; if (!cursor) {
577
- return callback(null, { type: 'remote', db, entries })
578
- }entries[cursor.primaryKey] = { timestamp: cursor.key }; cursor.continue()
579
- }
580
- } catch (e) {
581
- return callback(e)
582
- }
583
- })
584
- }, loadLocalEntry: (path, callback) => {
585
- let stat, node; try {
586
- const lookup = FS.lookupPath(path); node = lookup.node; stat = FS.stat(path)
587
- } catch (e) {
588
- return callback(e)
589
- } if (FS.isDir(stat.mode)) {
590
- return callback(null, { timestamp: stat.mtime, mode: stat.mode })
591
- } else if (FS.isFile(stat.mode)) {
592
- node.contents = MEMFS.getFileDataAsTypedArray(node); return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents })
593
- } else {
594
- return callback(new Error('node type not supported'))
595
- }
596
- }, storeLocalEntry: (path, entry, callback) => {
597
- try {
598
- if (FS.isDir(entry.mode)) {
599
- FS.mkdirTree(path, entry.mode)
600
- } else if (FS.isFile(entry.mode)) {
601
- FS.writeFile(path, entry.contents, { canOwn: true })
602
- } else {
603
- return callback(new Error('node type not supported'))
604
- }FS.chmod(path, entry.mode); FS.utime(path, entry.timestamp, entry.timestamp)
605
- } catch (e) {
606
- return callback(e)
607
- }callback(null)
608
- }, removeLocalEntry: (path, callback) => {
609
- try {
610
- const stat = FS.stat(path); if (FS.isDir(stat.mode)) {
611
- FS.rmdir(path)
612
- } else if (FS.isFile(stat.mode)) {
613
- FS.unlink(path)
614
- }
615
- } catch (e) {
616
- return callback(e)
617
- }callback(null)
618
- }, loadRemoteEntry: (store, path, callback) => {
619
- const req = store.get(path); req.onsuccess = event => callback(null, event.target.result); req.onerror = (e) => {
620
- callback(e.target.error); e.preventDefault()
621
- }
622
- }, storeRemoteEntry: (store, path, entry, callback) => {
623
- try {
624
- var req = store.put(entry, path)
625
- } catch (e) {
626
- callback(e); return
627
- }req.onsuccess = event => callback(); req.onerror = (e) => {
628
- callback(e.target.error); e.preventDefault()
629
- }
630
- }, removeRemoteEntry: (store, path, callback) => {
631
- const req = store.delete(path); req.onsuccess = event => callback(); req.onerror = (e) => {
632
- callback(e.target.error); e.preventDefault()
633
- }
634
- }, reconcile: (src, dst, callback) => {
635
- let total = 0; const create = []; for (var [key, e] of Object.entries(src.entries)) {
636
- const e2 = dst.entries[key]; if (!e2 || e.timestamp.getTime() != e2.timestamp.getTime()) {
637
- create.push(key); total++
638
- }
639
- } const remove = []; for (var key of Object.keys(dst.entries)) {
640
- if (!src.entries[key]) {
641
- remove.push(key); total++
642
- }
643
- } if (!total) {
644
- return callback(null)
645
- } let errored = false; const db = src.type === 'remote' ? src.db : dst.db; const transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite'); const store = transaction.objectStore(IDBFS.DB_STORE_NAME); function done(err) {
646
- if (err && !errored) {
647
- errored = true; return callback(err)
648
- }
649
- }transaction.onerror = transaction.onabort = (e) => {
650
- done(e.target.error); e.preventDefault()
651
- }; transaction.oncomplete = (e) => {
652
- if (!errored) {
653
- callback(null)
654
- }
655
- }; for (const path of create.sort()) {
656
- if (dst.type === 'local') {
657
- IDBFS.loadRemoteEntry(store, path, (err, entry) => {
658
- if (err)
659
- return done(err); IDBFS.storeLocalEntry(path, entry, done)
660
- })
661
- } else {
662
- IDBFS.loadLocalEntry(path, (err, entry) => {
663
- if (err)
664
- return done(err); IDBFS.storeRemoteEntry(store, path, entry, done)
665
- })
666
- }
667
- } for (const path of remove.sort().reverse()) {
668
- if (dst.type === 'local') {
669
- IDBFS.removeLocalEntry(path, done)
670
- } else {
671
- IDBFS.removeRemoteEntry(store, path, done)
672
- }
673
- }
674
- } }; const asyncLoad = async (url) => {
675
- const arrayBuffer = await readAsync(url); return new Uint8Array(arrayBuffer)
676
- }; const FS_createDataFile = (...args) => FS.createDataFile(...args); const getUniqueRunDependency = id => id; let runDependencies = 0; let dependenciesFulfilled = null; const removeRunDependency = (id) => {
677
- runDependencies--; Module.monitorRunDependencies?.(runDependencies); if (runDependencies == 0) {
678
- if (dependenciesFulfilled) {
679
- const callback = dependenciesFulfilled; dependenciesFulfilled = null; callback()
680
- }
681
- }
682
- }; const addRunDependency = (id) => {
683
- runDependencies++; Module.monitorRunDependencies?.(runDependencies)
684
- }; let preloadPlugins = []; const FS_handledByPreloadPlugin = async (byteArray, fullname) => {
685
- if (typeof Browser != 'undefined')
686
- Browser.init(); for (const plugin of preloadPlugins) {
687
- if (plugin.canHandle(fullname)) {
688
- return plugin.handle(byteArray, fullname)
689
- }
690
- } return byteArray
691
- }; const FS_preloadFile = async (parent, name, url, canRead, canWrite, dontCreateFile, canOwn, preFinish) => {
692
- const fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; const dep = getUniqueRunDependency(`cp ${fullname}`); addRunDependency(dep); try {
693
- let byteArray = url; if (typeof url == 'string') {
694
- byteArray = await asyncLoad(url)
695
- }byteArray = await FS_handledByPreloadPlugin(byteArray, fullname); preFinish?.(); if (!dontCreateFile) {
696
- FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn)
697
- }
698
- } finally {
699
- removeRunDependency(dep)
700
- }
701
- }; const FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => {
702
- FS_preloadFile(parent, name, url, canRead, canWrite, dontCreateFile, canOwn, preFinish).then(onload).catch(onerror)
703
- }; var FS = { root: null, mounts: [], devices: {}, streams: [], nextInode: 1, nameTable: null, currentPath: '/', initialized: false, ignorePermissions: true, filesystems: null, syncFSRequests: 0, ErrnoError: class {
704
- name = 'ErrnoError'; constructor(errno) {
705
- this.errno = errno
706
- }
707
- }, FSStream: class {
708
- shared = {}; get object() {
709
- return this.node
710
- }
711
-
712
- set object(val) {
713
- this.node = val
714
- }
715
-
716
- get isRead() {
717
- return (this.flags & 2097155) !== 1
718
- }
719
-
720
- get isWrite() {
721
- return (this.flags & 2097155) !== 0
722
- }
723
-
724
- get isAppend() {
725
- return this.flags & 1024
726
- }
727
-
728
- get flags() {
729
- return this.shared.flags
730
- }
731
-
732
- set flags(val) {
733
- this.shared.flags = val
734
- }
735
-
736
- get position() {
737
- return this.shared.position
738
- }
739
-
740
- set position(val) {
741
- this.shared.position = val
742
- }
743
- }, FSNode: class {
744
- node_ops = {}; stream_ops = {}; readMode = 292 | 73; writeMode = 146; mounted = null; constructor(parent, name, mode, rdev) {
745
- if (!parent) {
746
- parent = this
747
- } this.parent = parent; this.mount = parent.mount; this.id = FS.nextInode++; this.name = name; this.mode = mode; this.rdev = rdev; this.atime = this.mtime = this.ctime = Date.now()
748
- }
749
-
750
- get read() {
751
- return (this.mode & this.readMode) === this.readMode
752
- }
753
-
754
- set read(val) {
755
- val ? this.mode |= this.readMode : this.mode &= ~this.readMode
756
- }
757
-
758
- get write() {
759
- return (this.mode & this.writeMode) === this.writeMode
760
- }
761
-
762
- set write(val) {
763
- val ? this.mode |= this.writeMode : this.mode &= ~this.writeMode
764
- }
765
-
766
- get isFolder() {
767
- return FS.isDir(this.mode)
768
- }
769
-
770
- get isDevice() {
771
- return FS.isChrdev(this.mode)
772
- }
773
- }, lookupPath(path, opts = {}) {
774
- if (!path) {
775
- throw new FS.ErrnoError(44)
776
- }opts.follow_mount ??= true; if (!PATH.isAbs(path)) {
777
- path = `${FS.cwd()}/${path}`
778
- }linkloop:for (let nlinks = 0; nlinks < 40; nlinks++) {
779
- const parts = path.split('/').filter(p => !!p); let current = FS.root; let current_path = '/'; for (let i = 0; i < parts.length; i++) {
780
- const islast = i === parts.length - 1; if (islast && opts.parent) {
781
- break
782
- } if (parts[i] === '.') {
783
- continue
784
- } if (parts[i] === '..') {
785
- current_path = PATH.dirname(current_path); if (FS.isRoot(current)) {
786
- path = `${current_path}/${parts.slice(i + 1).join('/')}`; nlinks--; continue linkloop
787
- } else {
788
- current = current.parent
789
- } continue
790
- }current_path = PATH.join2(current_path, parts[i]); try {
791
- current = FS.lookupNode(current, parts[i])
792
- } catch (e) {
793
- if (e?.errno === 44 && islast && opts.noent_okay) {
794
- return { path: current_path }
795
- } throw e
796
- } if (FS.isMountpoint(current) && (!islast || opts.follow_mount)) {
797
- current = current.mounted.root
798
- } if (FS.isLink(current.mode) && (!islast || opts.follow)) {
799
- if (!current.node_ops.readlink) {
800
- throw new FS.ErrnoError(52)
801
- } let link = current.node_ops.readlink(current); if (!PATH.isAbs(link)) {
802
- link = `${PATH.dirname(current_path)}/${link}`
803
- }path = `${link}/${parts.slice(i + 1).join('/')}`; continue linkloop
804
- }
805
- } return { path: current_path, node: current }
806
- } throw new FS.ErrnoError(32)
807
- }, getPath(node) {
808
- let path; while (true) {
809
- if (FS.isRoot(node)) {
810
- const mount = node.mount.mountpoint; if (!path)
811
- return mount; return mount[mount.length - 1] !== '/' ? `${mount}/${path}` : mount + path
812
- }path = path ? `${node.name}/${path}` : node.name; node = node.parent
813
- }
814
- }, hashName(parentid, name) {
815
- let hash = 0; for (let i = 0; i < name.length; i++) {
816
- hash = (hash << 5) - hash + name.charCodeAt(i) | 0
817
- } return (parentid + hash >>> 0) % FS.nameTable.length
818
- }, hashAddNode(node) {
819
- const hash = FS.hashName(node.parent.id, node.name); node.name_next = FS.nameTable[hash]; FS.nameTable[hash] = node
820
- }, hashRemoveNode(node) {
821
- const hash = FS.hashName(node.parent.id, node.name); if (FS.nameTable[hash] === node) {
822
- FS.nameTable[hash] = node.name_next
823
- } else {
824
- let current = FS.nameTable[hash]; while (current) {
825
- if (current.name_next === node) {
826
- current.name_next = node.name_next; break
827
- }current = current.name_next
828
- }
829
- }
830
- }, lookupNode(parent, name) {
831
- const errCode = FS.mayLookup(parent); if (errCode) {
832
- throw new FS.ErrnoError(errCode)
833
- } const hash = FS.hashName(parent.id, name); for (let node = FS.nameTable[hash]; node; node = node.name_next) {
834
- const nodeName = node.name; if (node.parent.id === parent.id && nodeName === name) {
835
- return node
836
- }
837
- } return FS.lookup(parent, name)
838
- }, createNode(parent, name, mode, rdev) {
839
- const node = new FS.FSNode(parent, name, mode, rdev); FS.hashAddNode(node); return node
840
- }, destroyNode(node) {
841
- FS.hashRemoveNode(node)
842
- }, isRoot(node) {
843
- return node === node.parent
844
- }, isMountpoint(node) {
845
- return !!node.mounted
846
- }, isFile(mode) {
847
- return (mode & 61440) === 32768
848
- }, isDir(mode) {
849
- return (mode & 61440) === 16384
850
- }, isLink(mode) {
851
- return (mode & 61440) === 40960
852
- }, isChrdev(mode) {
853
- return (mode & 61440) === 8192
854
- }, isBlkdev(mode) {
855
- return (mode & 61440) === 24576
856
- }, isFIFO(mode) {
857
- return (mode & 61440) === 4096
858
- }, isSocket(mode) {
859
- return (mode & 49152) === 49152
860
- }, flagsToPermissionString(flag) {
861
- let perms = ['r', 'w', 'rw'][flag & 3]; if (flag & 512) {
862
- perms += 'w'
863
- } return perms
864
- }, nodePermissions(node, perms) {
865
- if (FS.ignorePermissions) {
866
- return 0
867
- } if (perms.includes('r') && !(node.mode & 292)) {
868
- return 2
869
- } if (perms.includes('w') && !(node.mode & 146)) {
870
- return 2
871
- } if (perms.includes('x') && !(node.mode & 73)) {
872
- return 2
873
- } return 0
874
- }, mayLookup(dir) {
875
- if (!FS.isDir(dir.mode))
876
- return 54; const errCode = FS.nodePermissions(dir, 'x'); if (errCode)
877
- return errCode; if (!dir.node_ops.lookup)
878
- return 2; return 0
879
- }, mayCreate(dir, name) {
880
- if (!FS.isDir(dir.mode)) {
881
- return 54
882
- } try {
883
- const node = FS.lookupNode(dir, name); return 20
884
- } catch (e) {} return FS.nodePermissions(dir, 'wx')
885
- }, mayDelete(dir, name, isdir) {
886
- let node; try {
887
- node = FS.lookupNode(dir, name)
888
- } catch (e) {
889
- return e.errno
890
- } const errCode = FS.nodePermissions(dir, 'wx'); if (errCode) {
891
- return errCode
892
- } if (isdir) {
893
- if (!FS.isDir(node.mode)) {
894
- return 54
895
- } if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
896
- return 10
897
- }
898
- } else if (FS.isDir(node.mode)) {
899
- return 31
900
- } return 0
901
- }, mayOpen(node, flags) {
902
- if (!node) {
903
- return 44
904
- } if (FS.isLink(node.mode)) {
905
- return 32
906
- } const mode = FS.flagsToPermissionString(flags); if (FS.isDir(node.mode)) {
907
- if (mode !== 'r' || flags & (512 | 64)) {
908
- return 31
909
- }
910
- } return FS.nodePermissions(node, mode)
911
- }, checkOpExists(op, err) {
912
- if (!op) {
913
- throw new FS.ErrnoError(err)
914
- } return op
915
- }, MAX_OPEN_FDS: 4096, nextfd() {
916
- for (let fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) {
917
- if (!FS.streams[fd]) {
918
- return fd
919
- }
920
- } throw new FS.ErrnoError(33)
921
- }, getStreamChecked(fd) {
922
- const stream = FS.getStream(fd); if (!stream) {
923
- throw new FS.ErrnoError(8)
924
- } return stream
925
- }, getStream: fd => FS.streams[fd], createStream(stream, fd = -1) {
926
- stream = Object.assign(new FS.FSStream(), stream); if (fd == -1) {
927
- fd = FS.nextfd()
928
- }stream.fd = fd; FS.streams[fd] = stream; return stream
929
- }, closeStream(fd) {
930
- FS.streams[fd] = null
931
- }, dupStream(origStream, fd = -1) {
932
- const stream = FS.createStream(origStream, fd); stream.stream_ops?.dup?.(stream); return stream
933
- }, doSetAttr(stream, node, attr) {
934
- let setattr = stream?.stream_ops.setattr; const arg = setattr ? stream : node; setattr ??= node.node_ops.setattr; FS.checkOpExists(setattr, 63); setattr(arg, attr)
935
- }, chrdev_stream_ops: { open(stream) {
936
- const device = FS.getDevice(stream.node.rdev); stream.stream_ops = device.stream_ops; stream.stream_ops.open?.(stream)
937
- }, llseek() {
938
- throw new FS.ErrnoError(70)
939
- } }, major: dev => dev >> 8, minor: dev => dev & 255, makedev: (ma, mi) => ma << 8 | mi, registerDevice(dev, ops) {
940
- FS.devices[dev] = { stream_ops: ops }
941
- }, getDevice: dev => FS.devices[dev], getMounts(mount) {
942
- const mounts = []; const check = [mount]; while (check.length) {
943
- const m = check.pop(); mounts.push(m); check.push(...m.mounts)
944
- } return mounts
945
- }, syncfs(populate, callback) {
946
- if (typeof populate == 'function') {
947
- callback = populate; populate = false
948
- }FS.syncFSRequests++; if (FS.syncFSRequests > 1) {
949
- err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)
950
- } const mounts = FS.getMounts(FS.root.mount); let completed = 0; function doCallback(errCode) {
951
- FS.syncFSRequests--; return callback(errCode)
952
- } function done(errCode) {
953
- if (errCode) {
954
- if (!done.errored) {
955
- done.errored = true; return doCallback(errCode)
956
- } return
957
- } if (++completed >= mounts.length) {
958
- doCallback(null)
959
- }
960
- } for (const mount of mounts) {
961
- if (mount.type.syncfs) {
962
- mount.type.syncfs(mount, populate, done)
963
- } else {
964
- done(null)
965
- }
966
- }
967
- }, mount(type, opts, mountpoint) {
968
- const root = mountpoint === '/'; const pseudo = !mountpoint; let node; if (root && FS.root) {
969
- throw new FS.ErrnoError(10)
970
- } else if (!root && !pseudo) {
971
- const lookup = FS.lookupPath(mountpoint, { follow_mount: false }); mountpoint = lookup.path; node = lookup.node; if (FS.isMountpoint(node)) {
972
- throw new FS.ErrnoError(10)
973
- } if (!FS.isDir(node.mode)) {
974
- throw new FS.ErrnoError(54)
975
- }
976
- } const mount = { type, opts, mountpoint, mounts: [] }; const mountRoot = type.mount(mount); mountRoot.mount = mount; mount.root = mountRoot; if (root) {
977
- FS.root = mountRoot
978
- } else if (node) {
979
- node.mounted = mount; if (node.mount) {
980
- node.mount.mounts.push(mount)
981
- }
982
- } return mountRoot
983
- }, unmount(mountpoint) {
984
- const lookup = FS.lookupPath(mountpoint, { follow_mount: false }); if (!FS.isMountpoint(lookup.node)) {
985
- throw new FS.ErrnoError(28)
986
- } const node = lookup.node; const mount = node.mounted; const mounts = FS.getMounts(mount); for (let [hash, current] of Object.entries(FS.nameTable)) {
987
- while (current) {
988
- const next = current.name_next; if (mounts.includes(current.mount)) {
989
- FS.destroyNode(current)
990
- }current = next
991
- }
992
- }node.mounted = null; const idx = node.mount.mounts.indexOf(mount); node.mount.mounts.splice(idx, 1)
993
- }, lookup(parent, name) {
994
- return parent.node_ops.lookup(parent, name)
995
- }, mknod(path, mode, dev) {
996
- const lookup = FS.lookupPath(path, { parent: true }); const parent = lookup.node; const name = PATH.basename(path); if (!name) {
997
- throw new FS.ErrnoError(28)
998
- } if (name === '.' || name === '..') {
999
- throw new FS.ErrnoError(20)
1000
- } const errCode = FS.mayCreate(parent, name); if (errCode) {
1001
- throw new FS.ErrnoError(errCode)
1002
- } if (!parent.node_ops.mknod) {
1003
- throw new FS.ErrnoError(63)
1004
- } return parent.node_ops.mknod(parent, name, mode, dev)
1005
- }, statfs(path) {
1006
- return FS.statfsNode(FS.lookupPath(path, { follow: true }).node)
1007
- }, statfsStream(stream) {
1008
- return FS.statfsNode(stream.node)
1009
- }, statfsNode(node) {
1010
- const rtn = { bsize: 4096, frsize: 4096, blocks: 1e6, bfree: 5e5, bavail: 5e5, files: FS.nextInode, ffree: FS.nextInode - 1, fsid: 42, flags: 2, namelen: 255 }; if (node.node_ops.statfs) {
1011
- Object.assign(rtn, node.node_ops.statfs(node.mount.opts.root))
1012
- } return rtn
1013
- }, create(path, mode = 438) {
1014
- mode &= 4095; mode |= 32768; return FS.mknod(path, mode, 0)
1015
- }, mkdir(path, mode = 511) {
1016
- mode &= 511 | 512; mode |= 16384; return FS.mknod(path, mode, 0)
1017
- }, mkdirTree(path, mode) {
1018
- const dirs = path.split('/'); let d = ''; for (const dir of dirs) {
1019
- if (!dir)
1020
- continue; if (d || PATH.isAbs(path))
1021
- d += '/'; d += dir; try {
1022
- FS.mkdir(d, mode)
1023
- } catch (e) {
1024
- if (e.errno != 20)
1025
- throw e
1026
- }
1027
- }
1028
- }, mkdev(path, mode, dev) {
1029
- if (typeof dev == 'undefined') {
1030
- dev = mode; mode = 438
1031
- }mode |= 8192; return FS.mknod(path, mode, dev)
1032
- }, symlink(oldpath, newpath) {
1033
- if (!PATH_FS.resolve(oldpath)) {
1034
- throw new FS.ErrnoError(44)
1035
- } const lookup = FS.lookupPath(newpath, { parent: true }); const parent = lookup.node; if (!parent) {
1036
- throw new FS.ErrnoError(44)
1037
- } const newname = PATH.basename(newpath); const errCode = FS.mayCreate(parent, newname); if (errCode) {
1038
- throw new FS.ErrnoError(errCode)
1039
- } if (!parent.node_ops.symlink) {
1040
- throw new FS.ErrnoError(63)
1041
- } return parent.node_ops.symlink(parent, newname, oldpath)
1042
- }, rename(old_path, new_path) {
1043
- const old_dirname = PATH.dirname(old_path); const new_dirname = PATH.dirname(new_path); const old_name = PATH.basename(old_path); const new_name = PATH.basename(new_path); let 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)
1044
- throw new FS.ErrnoError(44); if (old_dir.mount !== new_dir.mount) {
1045
- throw new FS.ErrnoError(75)
1046
- } const old_node = FS.lookupNode(old_dir, old_name); let relative = PATH_FS.relative(old_path, new_dirname); if (relative.charAt(0) !== '.') {
1047
- throw new FS.ErrnoError(28)
1048
- }relative = PATH_FS.relative(new_path, old_dirname); if (relative.charAt(0) !== '.') {
1049
- throw new FS.ErrnoError(55)
1050
- } let new_node; try {
1051
- new_node = FS.lookupNode(new_dir, new_name)
1052
- } catch (e) {} if (old_node === new_node) {
1053
- return
1054
- } const isdir = FS.isDir(old_node.mode); let errCode = FS.mayDelete(old_dir, old_name, isdir); if (errCode) {
1055
- throw new FS.ErrnoError(errCode)
1056
- }errCode = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name); if (errCode) {
1057
- throw new FS.ErrnoError(errCode)
1058
- } if (!old_dir.node_ops.rename) {
1059
- throw new FS.ErrnoError(63)
1060
- } if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) {
1061
- throw new FS.ErrnoError(10)
1062
- } if (new_dir !== old_dir) {
1063
- errCode = FS.nodePermissions(old_dir, 'w'); if (errCode) {
1064
- throw new FS.ErrnoError(errCode)
1065
- }
1066
- }FS.hashRemoveNode(old_node); try {
1067
- old_dir.node_ops.rename(old_node, new_dir, new_name); old_node.parent = new_dir
1068
- } catch (e) {
1069
- throw e
1070
- } finally {
1071
- FS.hashAddNode(old_node)
1072
- }
1073
- }, rmdir(path) {
1074
- const lookup = FS.lookupPath(path, { parent: true }); const parent = lookup.node; const name = PATH.basename(path); const node = FS.lookupNode(parent, name); const errCode = FS.mayDelete(parent, name, true); if (errCode) {
1075
- throw new FS.ErrnoError(errCode)
1076
- } if (!parent.node_ops.rmdir) {
1077
- throw new FS.ErrnoError(63)
1078
- } if (FS.isMountpoint(node)) {
1079
- throw new FS.ErrnoError(10)
1080
- }parent.node_ops.rmdir(parent, name); FS.destroyNode(node)
1081
- }, readdir(path) {
1082
- const lookup = FS.lookupPath(path, { follow: true }); const node = lookup.node; const readdir = FS.checkOpExists(node.node_ops.readdir, 54); return readdir(node)
1083
- }, unlink(path) {
1084
- const lookup = FS.lookupPath(path, { parent: true }); const parent = lookup.node; if (!parent) {
1085
- throw new FS.ErrnoError(44)
1086
- } const name = PATH.basename(path); const node = FS.lookupNode(parent, name); const errCode = FS.mayDelete(parent, name, false); if (errCode) {
1087
- throw new FS.ErrnoError(errCode)
1088
- } if (!parent.node_ops.unlink) {
1089
- throw new FS.ErrnoError(63)
1090
- } if (FS.isMountpoint(node)) {
1091
- throw new FS.ErrnoError(10)
1092
- }parent.node_ops.unlink(parent, name); FS.destroyNode(node)
1093
- }, readlink(path) {
1094
- const lookup = FS.lookupPath(path); const link = lookup.node; if (!link) {
1095
- throw new FS.ErrnoError(44)
1096
- } if (!link.node_ops.readlink) {
1097
- throw new FS.ErrnoError(28)
1098
- } return link.node_ops.readlink(link)
1099
- }, stat(path, dontFollow) {
1100
- const lookup = FS.lookupPath(path, { follow: !dontFollow }); const node = lookup.node; const getattr = FS.checkOpExists(node.node_ops.getattr, 63); return getattr(node)
1101
- }, fstat(fd) {
1102
- const stream = FS.getStreamChecked(fd); const node = stream.node; let getattr = stream.stream_ops.getattr; const arg = getattr ? stream : node; getattr ??= node.node_ops.getattr; FS.checkOpExists(getattr, 63); return getattr(arg)
1103
- }, lstat(path) {
1104
- return FS.stat(path, true)
1105
- }, doChmod(stream, node, mode, dontFollow) {
1106
- FS.doSetAttr(stream, node, { mode: mode & 4095 | node.mode & ~4095, ctime: Date.now(), dontFollow })
1107
- }, chmod(path, mode, dontFollow) {
1108
- let node; if (typeof path == 'string') {
1109
- const lookup = FS.lookupPath(path, { follow: !dontFollow }); node = lookup.node
1110
- } else {
1111
- node = path
1112
- }FS.doChmod(null, node, mode, dontFollow)
1113
- }, lchmod(path, mode) {
1114
- FS.chmod(path, mode, true)
1115
- }, fchmod(fd, mode) {
1116
- const stream = FS.getStreamChecked(fd); FS.doChmod(stream, stream.node, mode, false)
1117
- }, doChown(stream, node, dontFollow) {
1118
- FS.doSetAttr(stream, node, { timestamp: Date.now(), dontFollow })
1119
- }, chown(path, uid, gid, dontFollow) {
1120
- let node; if (typeof path == 'string') {
1121
- const lookup = FS.lookupPath(path, { follow: !dontFollow }); node = lookup.node
1122
- } else {
1123
- node = path
1124
- }FS.doChown(null, node, dontFollow)
1125
- }, lchown(path, uid, gid) {
1126
- FS.chown(path, uid, gid, true)
1127
- }, fchown(fd, uid, gid) {
1128
- const stream = FS.getStreamChecked(fd); FS.doChown(stream, stream.node, false)
1129
- }, doTruncate(stream, node, len) {
1130
- if (FS.isDir(node.mode)) {
1131
- throw new FS.ErrnoError(31)
1132
- } if (!FS.isFile(node.mode)) {
1133
- throw new FS.ErrnoError(28)
1134
- } const errCode = FS.nodePermissions(node, 'w'); if (errCode) {
1135
- throw new FS.ErrnoError(errCode)
1136
- }FS.doSetAttr(stream, node, { size: len, timestamp: Date.now() })
1137
- }, truncate(path, len) {
1138
- if (len < 0) {
1139
- throw new FS.ErrnoError(28)
1140
- } let node; if (typeof path == 'string') {
1141
- const lookup = FS.lookupPath(path, { follow: true }); node = lookup.node
1142
- } else {
1143
- node = path
1144
- }FS.doTruncate(null, node, len)
1145
- }, ftruncate(fd, len) {
1146
- const stream = FS.getStreamChecked(fd); if (len < 0 || (stream.flags & 2097155) === 0) {
1147
- throw new FS.ErrnoError(28)
1148
- }FS.doTruncate(stream, stream.node, len)
1149
- }, utime(path, atime, mtime) {
1150
- const lookup = FS.lookupPath(path, { follow: true }); const node = lookup.node; const setattr = FS.checkOpExists(node.node_ops.setattr, 63); setattr(node, { atime, mtime })
1151
- }, open(path, flags, mode = 438) {
1152
- if (path === '') {
1153
- throw new FS.ErrnoError(44)
1154
- }flags = typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; if (flags & 64) {
1155
- mode = mode & 4095 | 32768
1156
- } else {
1157
- mode = 0
1158
- } let node; let isDirPath; if (typeof path == 'object') {
1159
- node = path
1160
- } else {
1161
- isDirPath = path.endsWith('/'); const lookup = FS.lookupPath(path, { follow: !(flags & 131072), noent_okay: true }); node = lookup.node; path = lookup.path
1162
- } let created = false; if (flags & 64) {
1163
- if (node) {
1164
- if (flags & 128) {
1165
- throw new FS.ErrnoError(20)
1166
- }
1167
- } else if (isDirPath) {
1168
- throw new FS.ErrnoError(31)
1169
- } else {
1170
- node = FS.mknod(path, mode | 511, 0); created = true
1171
- }
1172
- } if (!node) {
1173
- throw new FS.ErrnoError(44)
1174
- } if (FS.isChrdev(node.mode)) {
1175
- flags &= ~512
1176
- } if (flags & 65536 && !FS.isDir(node.mode)) {
1177
- throw new FS.ErrnoError(54)
1178
- } if (!created) {
1179
- const errCode = FS.mayOpen(node, flags); if (errCode) {
1180
- throw new FS.ErrnoError(errCode)
1181
- }
1182
- } if (flags & 512 && !created) {
1183
- FS.truncate(node, 0)
1184
- }flags &= ~(128 | 512 | 131072); const stream = FS.createStream({ node, path: FS.getPath(node), flags, seekable: true, position: 0, stream_ops: node.stream_ops, ungotten: [], error: false }); if (stream.stream_ops.open) {
1185
- stream.stream_ops.open(stream)
1186
- } if (created) {
1187
- FS.chmod(node, mode & 511)
1188
- } return stream
1189
- }, close(stream) {
1190
- if (FS.isClosed(stream)) {
1191
- throw new FS.ErrnoError(8)
1192
- } if (stream.getdents)
1193
- stream.getdents = null; try {
1194
- if (stream.stream_ops.close) {
1195
- stream.stream_ops.close(stream)
1196
- }
1197
- } catch (e) {
1198
- throw e
1199
- } finally {
1200
- FS.closeStream(stream.fd)
1201
- }stream.fd = null
1202
- }, isClosed(stream) {
1203
- return stream.fd === null
1204
- }, llseek(stream, offset, whence) {
1205
- if (FS.isClosed(stream)) {
1206
- throw new FS.ErrnoError(8)
1207
- } if (!stream.seekable || !stream.stream_ops.llseek) {
1208
- throw new FS.ErrnoError(70)
1209
- } if (whence != 0 && whence != 1 && whence != 2) {
1210
- throw new FS.ErrnoError(28)
1211
- }stream.position = stream.stream_ops.llseek(stream, offset, whence); stream.ungotten = []; return stream.position
1212
- }, read(stream, buffer, offset, length, position) {
1213
- if (length < 0 || position < 0) {
1214
- throw new FS.ErrnoError(28)
1215
- } if (FS.isClosed(stream)) {
1216
- throw new FS.ErrnoError(8)
1217
- } if ((stream.flags & 2097155) === 1) {
1218
- throw new FS.ErrnoError(8)
1219
- } if (FS.isDir(stream.node.mode)) {
1220
- throw new FS.ErrnoError(31)
1221
- } if (!stream.stream_ops.read) {
1222
- throw new FS.ErrnoError(28)
1223
- } const seeking = typeof position != 'undefined'; if (!seeking) {
1224
- position = stream.position
1225
- } else if (!stream.seekable) {
1226
- throw new FS.ErrnoError(70)
1227
- } const bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); if (!seeking)
1228
- stream.position += bytesRead; return bytesRead
1229
- }, write(stream, buffer, offset, length, position, canOwn) {
1230
- if (length < 0 || position < 0) {
1231
- throw new FS.ErrnoError(28)
1232
- } if (FS.isClosed(stream)) {
1233
- throw new FS.ErrnoError(8)
1234
- } if ((stream.flags & 2097155) === 0) {
1235
- throw new FS.ErrnoError(8)
1236
- } if (FS.isDir(stream.node.mode)) {
1237
- throw new FS.ErrnoError(31)
1238
- } if (!stream.stream_ops.write) {
1239
- throw new FS.ErrnoError(28)
1240
- } if (stream.seekable && stream.flags & 1024) {
1241
- FS.llseek(stream, 0, 2)
1242
- } const seeking = typeof position != 'undefined'; if (!seeking) {
1243
- position = stream.position
1244
- } else if (!stream.seekable) {
1245
- throw new FS.ErrnoError(70)
1246
- } const bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); if (!seeking)
1247
- stream.position += bytesWritten; return bytesWritten
1248
- }, mmap(stream, length, position, prot, flags) {
1249
- if ((prot & 2) !== 0 && (flags & 2) === 0 && (stream.flags & 2097155) !== 2) {
1250
- throw new FS.ErrnoError(2)
1251
- } if ((stream.flags & 2097155) === 1) {
1252
- throw new FS.ErrnoError(2)
1253
- } if (!stream.stream_ops.mmap) {
1254
- throw new FS.ErrnoError(43)
1255
- } if (!length) {
1256
- throw new FS.ErrnoError(28)
1257
- } return stream.stream_ops.mmap(stream, length, position, prot, flags)
1258
- }, msync(stream, buffer, offset, length, mmapFlags) {
1259
- if (!stream.stream_ops.msync) {
1260
- return 0
1261
- } return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags)
1262
- }, ioctl(stream, cmd, arg) {
1263
- if (!stream.stream_ops.ioctl) {
1264
- throw new FS.ErrnoError(59)
1265
- } return stream.stream_ops.ioctl(stream, cmd, arg)
1266
- }, readFile(path, opts = {}) {
1267
- opts.flags = opts.flags || 0; opts.encoding = opts.encoding || 'binary'; if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
1268
- abort(`Invalid encoding type "${opts.encoding}"`)
1269
- } const stream = FS.open(path, opts.flags); const stat = FS.stat(path); const length = stat.size; let buf = new Uint8Array(length); FS.read(stream, buf, 0, length, 0); if (opts.encoding === 'utf8') {
1270
- buf = UTF8ArrayToString(buf)
1271
- }FS.close(stream); return buf
1272
- }, writeFile(path, data, opts = {}) {
1273
- opts.flags = opts.flags || 577; const stream = FS.open(path, opts.flags, opts.mode); if (typeof data == 'string') {
1274
- data = new Uint8Array(intArrayFromString(data, true))
1275
- } if (ArrayBuffer.isView(data)) {
1276
- FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn)
1277
- } else {
1278
- abort('Unsupported data type')
1279
- }FS.close(stream)
1280
- }, cwd: () => FS.currentPath, chdir(path) {
1281
- const lookup = FS.lookupPath(path, { follow: true }); if (lookup.node === null) {
1282
- throw new FS.ErrnoError(44)
1283
- } if (!FS.isDir(lookup.node.mode)) {
1284
- throw new FS.ErrnoError(54)
1285
- } const errCode = FS.nodePermissions(lookup.node, 'x'); if (errCode) {
1286
- throw new FS.ErrnoError(errCode)
1287
- }FS.currentPath = lookup.path
1288
- }, createDefaultDirectories() {
1289
- FS.mkdir('/tmp'); FS.mkdir('/home'); FS.mkdir('/home/web_user')
1290
- }, createDefaultDevices() {
1291
- FS.mkdir('/dev'); FS.registerDevice(FS.makedev(1, 3), { read: () => 0, write: (stream, buffer, offset, length, pos) => length, llseek: () => 0 }); FS.mkdev('/dev/null', FS.makedev(1, 3)); TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); FS.mkdev('/dev/tty', FS.makedev(5, 0)); FS.mkdev('/dev/tty1', FS.makedev(6, 0)); const randomBuffer = new Uint8Array(1024); let randomLeft = 0; const randomByte = () => {
1292
- if (randomLeft === 0) {
1293
- randomFill(randomBuffer); randomLeft = randomBuffer.byteLength
1294
- } return randomBuffer[--randomLeft]
1295
- }; FS.createDevice('/dev', 'random', randomByte); FS.createDevice('/dev', 'urandom', randomByte); FS.mkdir('/dev/shm'); FS.mkdir('/dev/shm/tmp')
1296
- }, createSpecialDirectories() {
1297
- FS.mkdir('/proc'); const proc_self = FS.mkdir('/proc/self'); FS.mkdir('/proc/self/fd'); FS.mount({ mount() {
1298
- const node = FS.createNode(proc_self, 'fd', 16895, 73); node.stream_ops = { llseek: MEMFS.stream_ops.llseek }; node.node_ops = { lookup(parent, name) {
1299
- const fd = +name; const stream = FS.getStreamChecked(fd); const ret = { parent: null, mount: { mountpoint: 'fake' }, node_ops: { readlink: () => stream.path }, id: fd + 1 }; ret.parent = ret; return ret
1300
- }, readdir() {
1301
- return Array.from(FS.streams.entries()).filter(([k, v]) => v).map(([k, v]) => k.toString())
1302
- } }; return node
1303
- } }, {}, '/proc/self/fd')
1304
- }, createStandardStreams(input, output, error) {
1305
- if (input) {
1306
- FS.createDevice('/dev', 'stdin', input)
1307
- } else {
1308
- FS.symlink('/dev/tty', '/dev/stdin')
1309
- } if (output) {
1310
- FS.createDevice('/dev', 'stdout', null, output)
1311
- } else {
1312
- FS.symlink('/dev/tty', '/dev/stdout')
1313
- } if (error) {
1314
- FS.createDevice('/dev', 'stderr', null, error)
1315
- } else {
1316
- FS.symlink('/dev/tty1', '/dev/stderr')
1317
- } const stdin = FS.open('/dev/stdin', 0); const stdout = FS.open('/dev/stdout', 1); const stderr = FS.open('/dev/stderr', 1)
1318
- }, staticInit() {
1319
- FS.nameTable = Array.from({ length: 4096 }); FS.mount(MEMFS, {}, '/'); FS.createDefaultDirectories(); FS.createDefaultDevices(); FS.createSpecialDirectories(); FS.filesystems = { MEMFS, IDBFS }
1320
- }, init(input, output, error) {
1321
- FS.initialized = true; input ??= Module.stdin; output ??= Module.stdout; error ??= Module.stderr; FS.createStandardStreams(input, output, error)
1322
- }, quit() {
1323
- FS.initialized = false; for (const stream of FS.streams) {
1324
- if (stream) {
1325
- FS.close(stream)
1326
- }
1327
- }
1328
- }, findObject(path, dontResolveLastLink) {
1329
- const ret = FS.analyzePath(path, dontResolveLastLink); if (!ret.exists) {
1330
- return null
1331
- } return ret.object
1332
- }, analyzePath(path, dontResolveLastLink) {
1333
- try {
1334
- var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); path = lookup.path
1335
- } catch (e) {} const ret = { isRoot: false, exists: false, error: 0, name: null, path: null, object: null, parentExists: false, parentPath: null, parentObject: null }; try {
1336
- 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 === '/'
1337
- } catch (e) {
1338
- ret.error = e.errno
1339
- } return ret
1340
- }, createPath(parent, path, canRead, canWrite) {
1341
- parent = typeof parent == 'string' ? parent : FS.getPath(parent); const parts = path.split('/').reverse(); while (parts.length) {
1342
- const part = parts.pop(); if (!part)
1343
- continue; var current = PATH.join2(parent, part); try {
1344
- FS.mkdir(current)
1345
- } catch (e) {
1346
- if (e.errno != 20)
1347
- throw e
1348
- }parent = current
1349
- } return current
1350
- }, createFile(parent, name, properties, canRead, canWrite) {
1351
- const path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); const mode = FS_getMode(canRead, canWrite); return FS.create(path, mode)
1352
- }, createDataFile(parent, name, data, canRead, canWrite, canOwn) {
1353
- let path = name; if (parent) {
1354
- parent = typeof parent == 'string' ? parent : FS.getPath(parent); path = name ? PATH.join2(parent, name) : parent
1355
- } const mode = FS_getMode(canRead, canWrite); const node = FS.create(path, mode); if (data) {
1356
- if (typeof data == 'string') {
1357
- const arr = Array.from({ length: data.length }); for (let i = 0, len = data.length; i < len; ++i)arr[i] = data.charCodeAt(i); data = arr
1358
- }FS.chmod(node, mode | 146); const stream = FS.open(node, 577); FS.write(stream, data, 0, data.length, 0, canOwn); FS.close(stream); FS.chmod(node, mode)
1359
- }
1360
- }, createDevice(parent, name, input, output) {
1361
- const path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); const mode = FS_getMode(!!input, !!output); FS.createDevice.major ??= 64; const dev = FS.makedev(FS.createDevice.major++, 0); FS.registerDevice(dev, { open(stream) {
1362
- stream.seekable = false
1363
- }, close(stream) {
1364
- if (output?.buffer?.length) {
1365
- output(10)
1366
- }
1367
- }, read(stream, buffer, offset, length, pos) {
1368
- let bytesRead = 0; for (let i = 0; i < length; i++) {
1369
- var result; try {
1370
- result = input()
1371
- } catch (e) {
1372
- throw new FS.ErrnoError(29)
1373
- } if (result === undefined && bytesRead === 0) {
1374
- throw new FS.ErrnoError(6)
1375
- } if (result === null || result === undefined)
1376
- break; bytesRead++; buffer[offset + i] = result
1377
- } if (bytesRead) {
1378
- stream.node.atime = Date.now()
1379
- } return bytesRead
1380
- }, write(stream, buffer, offset, length, pos) {
1381
- for (var i = 0; i < length; i++) {
1382
- try {
1383
- output(buffer[offset + i])
1384
- } catch (e) {
1385
- throw new FS.ErrnoError(29)
1386
- }
1387
- } if (length) {
1388
- stream.node.mtime = stream.node.ctime = Date.now()
1389
- } return i
1390
- } }); return FS.mkdev(path, mode, dev)
1391
- }, forceLoadFile(obj) {
1392
- if (obj.isDevice || obj.isFolder || obj.link || obj.contents)
1393
- return true; if (globalThis.XMLHttpRequest) {
1394
- abort('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.')
1395
- } else {
1396
- try {
1397
- obj.contents = readBinary(obj.url)
1398
- } catch (e) {
1399
- throw new FS.ErrnoError(29)
1400
- }
1401
- }
1402
- }, createLazyFile(parent, name, url, canRead, canWrite) {
1403
- class LazyUint8Array {
1404
- lengthKnown = false; chunks = []; get(idx) {
1405
- if (idx > this.length - 1 || idx < 0) {
1406
- return undefined
1407
- } const chunkOffset = idx % this.chunkSize; const chunkNum = idx / this.chunkSize | 0; return this.getter(chunkNum)[chunkOffset]
1408
- }
1409
-
1410
- setDataGetter(getter) {
1411
- this.getter = getter
1412
- }
1413
-
1414
- cacheLength() {
1415
- const xhr = new XMLHttpRequest(); xhr.open('HEAD', url, false); xhr.send(null); if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304))
1416
- abort(`Couldn't load ${url}. Status: ${xhr.status}`); let datalength = Number(xhr.getResponseHeader('Content-length')); let header; const hasByteServing = (header = xhr.getResponseHeader('Accept-Ranges')) && header === 'bytes'; const usesGzip = (header = xhr.getResponseHeader('Content-Encoding')) && header === 'gzip'; let chunkSize = 1024 * 1024; if (!hasByteServing)
1417
- chunkSize = datalength; const doXHR = (from, to) => {
1418
- if (from > to)
1419
- abort(`invalid range (${from}, ${to}) or no bytes requested!`); if (to > datalength - 1)
1420
- abort(`only ${datalength} bytes available! programmer error!`); const xhr = new XMLHttpRequest(); xhr.open('GET', url, false); if (datalength !== chunkSize)
1421
- xhr.setRequestHeader('Range', `bytes=${from}-${to}`); xhr.responseType = 'arraybuffer'; if (xhr.overrideMimeType) {
1422
- xhr.overrideMimeType('text/plain; charset=x-user-defined')
1423
- }xhr.send(null); if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304))
1424
- abort(`Couldn't load ${url}. Status: ${xhr.status}`); if (xhr.response !== undefined) {
1425
- return new Uint8Array(xhr.response || [])
1426
- } return intArrayFromString(xhr.responseText || '', true)
1427
- }; const lazyArray = this; lazyArray.setDataGetter((chunkNum) => {
1428
- const start = chunkNum * chunkSize; let end = (chunkNum + 1) * chunkSize - 1; end = Math.min(end, datalength - 1); if (typeof lazyArray.chunks[chunkNum] == 'undefined') {
1429
- lazyArray.chunks[chunkNum] = doXHR(start, end)
1430
- } if (typeof lazyArray.chunks[chunkNum] == 'undefined')
1431
- abort('doXHR failed!'); return lazyArray.chunks[chunkNum]
1432
- }); if (usesGzip || !datalength) {
1433
- chunkSize = datalength = 1; datalength = this.getter(0).length; chunkSize = datalength; out('LazyFiles on gzip forces download of the whole file when length is accessed')
1434
- } this._length = datalength; this._chunkSize = chunkSize; this.lengthKnown = true
1435
- }
1436
-
1437
- get length() {
1438
- if (!this.lengthKnown) {
1439
- this.cacheLength()
1440
- } return this._length
1441
- }
1442
-
1443
- get chunkSize() {
1444
- if (!this.lengthKnown) {
1445
- this.cacheLength()
1446
- } return this._chunkSize
1447
- }
1448
- } if (globalThis.XMLHttpRequest) {
1449
- if (!ENVIRONMENT_IS_WORKER)
1450
- abort('Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'); const lazyArray = new LazyUint8Array(); var properties = { isDevice: false, contents: lazyArray }
1451
- } else {
1452
- var properties = { isDevice: false, url }
1453
- } const node = FS.createFile(parent, name, properties, canRead, canWrite); if (properties.contents) {
1454
- node.contents = properties.contents
1455
- } else if (properties.url) {
1456
- node.contents = null; node.url = properties.url
1457
- }Object.defineProperties(node, { usedBytes: { get() {
1458
- return this.contents.length
1459
- } } }); const stream_ops = {}; for (const [key, fn] of Object.entries(node.stream_ops)) {
1460
- stream_ops[key] = (...args) => {
1461
- FS.forceLoadFile(node); return fn(...args)
1462
- }
1463
- } function writeChunks(stream, buffer, offset, length, position) {
1464
- const contents = stream.node.contents; if (position >= contents.length)
1465
- return 0; const size = Math.min(contents.length - position, length); if (contents.slice) {
1466
- for (var i = 0; i < size; i++) {
1467
- buffer[offset + i] = contents[position + i]
1468
- }
1469
- } else {
1470
- for (var i = 0; i < size; i++) {
1471
- buffer[offset + i] = contents.get(position + i)
1472
- }
1473
- } return size
1474
- }stream_ops.read = (stream, buffer, offset, length, position) => {
1475
- FS.forceLoadFile(node); return writeChunks(stream, buffer, offset, length, position)
1476
- }; stream_ops.mmap = (stream, length, position, prot, flags) => {
1477
- FS.forceLoadFile(node); const ptr = mmapAlloc(length); if (!ptr) {
1478
- throw new FS.ErrnoError(48)
1479
- }writeChunks(stream, HEAP8, ptr, length, position); return { ptr, allocated: true }
1480
- }; node.stream_ops = stream_ops; return node
1481
- } }; const UTF8ToString = (ptr, maxBytesToRead, ignoreNul) => {
1482
- ptr >>>= 0; if (!ptr)
1483
- return ''; const end = findStringEnd(HEAPU8, ptr, maxBytesToRead, ignoreNul); return UTF8Decoder.decode(HEAPU8.subarray(ptr >>> 0, end >>> 0))
1484
- }; var SYSCALLS = { calculateAt(dirfd, path, allowEmpty) {
1485
- if (PATH.isAbs(path)) {
1486
- return path
1487
- } let dir; if (dirfd === -100) {
1488
- dir = FS.cwd()
1489
- } else {
1490
- const dirstream = SYSCALLS.getStreamFromFD(dirfd); dir = dirstream.path
1491
- } if (path.length == 0) {
1492
- if (!allowEmpty) {
1493
- throw new FS.ErrnoError(44)
1494
- } return dir
1495
- } return `${dir}/${path}`
1496
- }, writeStat(buf, stat) {
1497
- HEAPU32[buf >>> 2 >>> 0] = stat.dev; HEAPU32[buf + 4 >>> 2 >>> 0] = stat.mode; HEAPU32[buf + 8 >>> 2 >>> 0] = stat.nlink; HEAPU32[buf + 12 >>> 2 >>> 0] = stat.uid; HEAPU32[buf + 16 >>> 2 >>> 0] = stat.gid; HEAPU32[buf + 20 >>> 2 >>> 0] = stat.rdev; HEAP64[buf + 24 >>> 3 >>> 0] = BigInt(stat.size); HEAP32[buf + 32 >>> 2 >>> 0] = 4096; HEAP32[buf + 36 >>> 2 >>> 0] = stat.blocks; const atime = stat.atime.getTime(); const mtime = stat.mtime.getTime(); const ctime = stat.ctime.getTime(); HEAP64[buf + 40 >>> 3 >>> 0] = BigInt(Math.floor(atime / 1e3)); HEAPU32[buf + 48 >>> 2 >>> 0] = atime % 1e3 * 1e3 * 1e3; HEAP64[buf + 56 >>> 3 >>> 0] = BigInt(Math.floor(mtime / 1e3)); HEAPU32[buf + 64 >>> 2 >>> 0] = mtime % 1e3 * 1e3 * 1e3; HEAP64[buf + 72 >>> 3 >>> 0] = BigInt(Math.floor(ctime / 1e3)); HEAPU32[buf + 80 >>> 2 >>> 0] = ctime % 1e3 * 1e3 * 1e3; HEAP64[buf + 88 >>> 3 >>> 0] = BigInt(stat.ino); return 0
1498
- }, writeStatFs(buf, stats) {
1499
- HEAPU32[buf + 4 >>> 2 >>> 0] = stats.bsize; HEAPU32[buf + 60 >>> 2 >>> 0] = stats.bsize; HEAP64[buf + 8 >>> 3 >>> 0] = BigInt(stats.blocks); HEAP64[buf + 16 >>> 3 >>> 0] = BigInt(stats.bfree); HEAP64[buf + 24 >>> 3 >>> 0] = BigInt(stats.bavail); HEAP64[buf + 32 >>> 3 >>> 0] = BigInt(stats.files); HEAP64[buf + 40 >>> 3 >>> 0] = BigInt(stats.ffree); HEAPU32[buf + 48 >>> 2 >>> 0] = stats.fsid; HEAPU32[buf + 64 >>> 2 >>> 0] = stats.flags; HEAPU32[buf + 56 >>> 2 >>> 0] = stats.namelen
1500
- }, doMsync(addr, stream, len, flags, offset) {
1501
- if (!FS.isFile(stream.node.mode)) {
1502
- throw new FS.ErrnoError(43)
1503
- } if (flags & 2) {
1504
- return 0
1505
- } const buffer = HEAPU8.slice(addr, addr + len); FS.msync(stream, buffer, offset, len, flags)
1506
- }, getStreamFromFD(fd) {
1507
- const stream = FS.getStreamChecked(fd); return stream
1508
- }, varargs: undefined, getStr(ptr) {
1509
- const ret = UTF8ToString(ptr); return ret
1510
- } }; const INT53_MAX = 9007199254740992; const INT53_MIN = -9007199254740992; const bigintToI53Checked = num => num < INT53_MIN || num > INT53_MAX ? Number.NaN : Number(num); function ___syscall_chmod(path, mode) {
1511
- path >>>= 0; try {
1512
- path = SYSCALLS.getStr(path); FS.chmod(path, mode); return 0
1513
- } catch (e) {
1514
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1515
- throw e; return -e.errno
1516
- }
1517
- } function ___syscall_faccessat(dirfd, path, amode, flags) {
1518
- path >>>= 0; try {
1519
- path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); if (amode & ~7) {
1520
- return -28
1521
- } const lookup = FS.lookupPath(path, { follow: true }); const node = lookup.node; if (!node) {
1522
- return -44
1523
- } let perms = ''; if (amode & 4)
1524
- perms += 'r'; if (amode & 2)
1525
- perms += 'w'; if (amode & 1)
1526
- perms += 'x'; if (perms && FS.nodePermissions(node, perms)) {
1527
- return -2
1528
- } return 0
1529
- } catch (e) {
1530
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1531
- throw e; return -e.errno
1532
- }
1533
- } function ___syscall_fchmod(fd, mode) {
1534
- try {
1535
- FS.fchmod(fd, mode); return 0
1536
- } catch (e) {
1537
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1538
- throw e; return -e.errno
1539
- }
1540
- } const syscallGetVarargI = () => {
1541
- const ret = HEAP32[+SYSCALLS.varargs >>> 2 >>> 0]; SYSCALLS.varargs += 4; return ret
1542
- }; const syscallGetVarargP = syscallGetVarargI; function ___syscall_fcntl64(fd, cmd, varargs) {
1543
- varargs >>>= 0; SYSCALLS.varargs = varargs; try {
1544
- const stream = SYSCALLS.getStreamFromFD(fd); switch (cmd) {
1545
- case 0:{ var arg = syscallGetVarargI(); if (arg < 0) {
1546
- return -28
1547
- } while (FS.streams[arg]) {
1548
- arg++
1549
- } let 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(); const offset = 0; HEAP16[arg + offset >>> 1 >>> 0] = 2; return 0 } case 13:case 14:return 0
1550
- } return -28
1551
- } catch (e) {
1552
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1553
- throw e; return -e.errno
1554
- }
1555
- } function ___syscall_fdatasync(fd) {
1556
- try {
1557
- const stream = SYSCALLS.getStreamFromFD(fd); return 0
1558
- } catch (e) {
1559
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1560
- throw e; return -e.errno
1561
- }
1562
- } function ___syscall_fstat64(fd, buf) {
1563
- buf >>>= 0; try {
1564
- return SYSCALLS.writeStat(buf, FS.fstat(fd))
1565
- } catch (e) {
1566
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1567
- throw e; return -e.errno
1568
- }
1569
- } function ___syscall_ftruncate64(fd, length) {
1570
- length = bigintToI53Checked(length); try {
1571
- if (isNaN(length))
1572
- return -61; FS.ftruncate(fd, length); return 0
1573
- } catch (e) {
1574
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1575
- throw e; return -e.errno
1576
- }
1577
- } const stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); function ___syscall_getcwd(buf, size) {
1578
- buf >>>= 0; size >>>= 0; try {
1579
- if (size === 0)
1580
- return -28; const cwd = FS.cwd(); const cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; if (size < cwdLengthInBytes)
1581
- return -68; stringToUTF8(cwd, buf, size); return cwdLengthInBytes
1582
- } catch (e) {
1583
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1584
- throw e; return -e.errno
1585
- }
1586
- } function ___syscall_getdents64(fd, dirp, count) {
1587
- dirp >>>= 0; count >>>= 0; try {
1588
- const stream = SYSCALLS.getStreamFromFD(fd); stream.getdents ||= FS.readdir(stream.path); const struct_size = 280; let pos = 0; const off = FS.llseek(stream, 0, 1); const startIdx = Math.floor(off / struct_size); const endIdx = Math.min(stream.getdents.length, startIdx + Math.floor(count / struct_size)); for (var idx = startIdx; idx < endIdx; idx++) {
1589
- var id; var type; const name = stream.getdents[idx]; if (name === '.') {
1590
- id = stream.node.id; type = 4
1591
- } else if (name === '..') {
1592
- const lookup = FS.lookupPath(stream.path, { parent: true }); id = lookup.node.id; type = 4
1593
- } else {
1594
- var child; try {
1595
- child = FS.lookupNode(stream.node, name)
1596
- } catch (e) {
1597
- if (e?.errno === 28) {
1598
- continue
1599
- } throw e
1600
- }id = child.id; type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8
1601
- }HEAP64[dirp + pos >>> 3 >>> 0] = BigInt(id); HEAP64[dirp + pos + 8 >>> 3 >>> 0] = BigInt((idx + 1) * struct_size); HEAP16[dirp + pos + 16 >>> 1 >>> 0] = 280; HEAP8[dirp + pos + 18 >>> 0] = type; stringToUTF8(name, dirp + pos + 19, 256); pos += struct_size
1602
- }FS.llseek(stream, idx * struct_size, 0); return pos
1603
- } catch (e) {
1604
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1605
- throw e; return -e.errno
1606
- }
1607
- } function ___syscall_ioctl(fd, op, varargs) {
1608
- varargs >>>= 0; SYSCALLS.varargs = varargs; try {
1609
- const stream = SYSCALLS.getStreamFromFD(fd); switch (op) {
1610
- case 21509:{ if (!stream.tty)
1611
- return -59; return 0 } case 21505:{ if (!stream.tty)
1612
- return -59; if (stream.tty.ops.ioctl_tcgets) {
1613
- const termios = stream.tty.ops.ioctl_tcgets(stream); var argp = syscallGetVarargP(); HEAP32[argp >>> 2 >>> 0] = termios.c_iflag || 0; HEAP32[argp + 4 >>> 2 >>> 0] = termios.c_oflag || 0; HEAP32[argp + 8 >>> 2 >>> 0] = termios.c_cflag || 0; HEAP32[argp + 12 >>> 2 >>> 0] = termios.c_lflag || 0; for (var i = 0; i < 32; i++) {
1614
- HEAP8[argp + i + 17 >>> 0] = termios.c_cc[i] || 0
1615
- } return 0
1616
- } return 0 } case 21510:case 21511:case 21512:{ if (!stream.tty)
1617
- return -59; return 0 } case 21506:case 21507:case 21508:{ if (!stream.tty)
1618
- return -59; if (stream.tty.ops.ioctl_tcsets) {
1619
- var argp = syscallGetVarargP(); const c_iflag = HEAP32[argp >>> 2 >>> 0]; const c_oflag = HEAP32[argp + 4 >>> 2 >>> 0]; const c_cflag = HEAP32[argp + 8 >>> 2 >>> 0]; const c_lflag = HEAP32[argp + 12 >>> 2 >>> 0]; const c_cc = []; for (var i = 0; i < 32; i++) {
1620
- c_cc.push(HEAP8[argp + i + 17 >>> 0])
1621
- } return stream.tty.ops.ioctl_tcsets(stream.tty, op, { c_iflag, c_oflag, c_cflag, c_lflag, c_cc })
1622
- } return 0 } case 21519:{ if (!stream.tty)
1623
- return -59; var argp = syscallGetVarargP(); HEAP32[argp >>> 2 >>> 0] = 0; return 0 } case 21520:{ if (!stream.tty)
1624
- return -59; return -28 } case 21537:case 21531:{ var argp = syscallGetVarargP(); return FS.ioctl(stream, op, argp) } case 21523:{ if (!stream.tty)
1625
- return -59; if (stream.tty.ops.ioctl_tiocgwinsz) {
1626
- const winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty); var argp = syscallGetVarargP(); HEAP16[argp >>> 1 >>> 0] = winsize[0]; HEAP16[argp + 2 >>> 1 >>> 0] = winsize[1]
1627
- } return 0 } case 21524:{ if (!stream.tty)
1628
- return -59; return 0 } case 21515:{ if (!stream.tty)
1629
- return -59; return 0 } default:return -28
1630
- }
1631
- } catch (e) {
1632
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1633
- throw e; return -e.errno
1634
- }
1635
- } function ___syscall_lstat64(path, buf) {
1636
- path >>>= 0; buf >>>= 0; try {
1637
- path = SYSCALLS.getStr(path); return SYSCALLS.writeStat(buf, FS.lstat(path))
1638
- } catch (e) {
1639
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1640
- throw e; return -e.errno
1641
- }
1642
- } function ___syscall_mkdirat(dirfd, path, mode) {
1643
- path >>>= 0; try {
1644
- path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); FS.mkdir(path, mode, 0); return 0
1645
- } catch (e) {
1646
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1647
- throw e; return -e.errno
1648
- }
1649
- } function ___syscall_newfstatat(dirfd, path, buf, flags) {
1650
- path >>>= 0; buf >>>= 0; try {
1651
- path = SYSCALLS.getStr(path); const nofollow = flags & 256; const allowEmpty = flags & 4096; flags = flags & ~6400; path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); return SYSCALLS.writeStat(buf, nofollow ? FS.lstat(path) : FS.stat(path))
1652
- } catch (e) {
1653
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1654
- throw e; return -e.errno
1655
- }
1656
- } function ___syscall_openat(dirfd, path, flags, varargs) {
1657
- path >>>= 0; varargs >>>= 0; SYSCALLS.varargs = varargs; try {
1658
- path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); const mode = varargs ? syscallGetVarargI() : 0; return FS.open(path, flags, mode).fd
1659
- } catch (e) {
1660
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1661
- throw e; return -e.errno
1662
- }
1663
- } function ___syscall_readlinkat(dirfd, path, buf, bufsize) {
1664
- path >>>= 0; buf >>>= 0; bufsize >>>= 0; try {
1665
- path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); if (bufsize <= 0)
1666
- return -28; const ret = FS.readlink(path); const len = Math.min(bufsize, lengthBytesUTF8(ret)); const endChar = HEAP8[buf + len >>> 0]; stringToUTF8(ret, buf, bufsize + 1); HEAP8[buf + len >>> 0] = endChar; return len
1667
- } catch (e) {
1668
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1669
- throw e; return -e.errno
1670
- }
1671
- } function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) {
1672
- oldpath >>>= 0; newpath >>>= 0; try {
1673
- oldpath = SYSCALLS.getStr(oldpath); newpath = SYSCALLS.getStr(newpath); oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); newpath = SYSCALLS.calculateAt(newdirfd, newpath); FS.rename(oldpath, newpath); return 0
1674
- } catch (e) {
1675
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1676
- throw e; return -e.errno
1677
- }
1678
- } function ___syscall_rmdir(path) {
1679
- path >>>= 0; try {
1680
- path = SYSCALLS.getStr(path); FS.rmdir(path); return 0
1681
- } catch (e) {
1682
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1683
- throw e; return -e.errno
1684
- }
1685
- } function ___syscall_stat64(path, buf) {
1686
- path >>>= 0; buf >>>= 0; try {
1687
- path = SYSCALLS.getStr(path); return SYSCALLS.writeStat(buf, FS.stat(path))
1688
- } catch (e) {
1689
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1690
- throw e; return -e.errno
1691
- }
1692
- } function ___syscall_truncate64(path, length) {
1693
- path >>>= 0; length = bigintToI53Checked(length); try {
1694
- if (isNaN(length))
1695
- return -61; path = SYSCALLS.getStr(path); FS.truncate(path, length); return 0
1696
- } catch (e) {
1697
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1698
- throw e; return -e.errno
1699
- }
1700
- } function ___syscall_unlinkat(dirfd, path, flags) {
1701
- path >>>= 0; try {
1702
- path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); if (!flags) {
1703
- FS.unlink(path)
1704
- } else if (flags === 512) {
1705
- FS.rmdir(path)
1706
- } else {
1707
- return -28
1708
- } return 0
1709
- } catch (e) {
1710
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1711
- throw e; return -e.errno
1712
- }
1713
- } const __abort_js = () => abort(''); let runtimeKeepaliveCounter = 0; const __emscripten_runtime_keepalive_clear = () => {
1714
- noExitRuntime = false; runtimeKeepaliveCounter = 0
1715
- }; const isLeapYear = year => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); const MONTH_DAYS_LEAP_CUMULATIVE = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; const MONTH_DAYS_REGULAR_CUMULATIVE = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; const ydayFromDate = (date) => {
1716
- const leap = isLeapYear(date.getFullYear()); const monthDaysCumulative = leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE; const yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; return yday
1717
- }; function __localtime_js(time, tmPtr) {
1718
- time = bigintToI53Checked(time); tmPtr >>>= 0; const date = new Date(time * 1e3); HEAP32[tmPtr >>> 2 >>> 0] = date.getSeconds(); HEAP32[tmPtr + 4 >>> 2 >>> 0] = date.getMinutes(); HEAP32[tmPtr + 8 >>> 2 >>> 0] = date.getHours(); HEAP32[tmPtr + 12 >>> 2 >>> 0] = date.getDate(); HEAP32[tmPtr + 16 >>> 2 >>> 0] = date.getMonth(); HEAP32[tmPtr + 20 >>> 2 >>> 0] = date.getFullYear() - 1900; HEAP32[tmPtr + 24 >>> 2 >>> 0] = date.getDay(); const yday = ydayFromDate(date) | 0; HEAP32[tmPtr + 28 >>> 2 >>> 0] = yday; HEAP32[tmPtr + 36 >>> 2 >>> 0] = -(date.getTimezoneOffset() * 60); const start = new Date(date.getFullYear(), 0, 1); const summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); const winterOffset = start.getTimezoneOffset(); const dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; HEAP32[tmPtr + 32 >>> 2 >>> 0] = dst
1719
- } function __mmap_js(len, prot, flags, fd, offset, allocated, addr) {
1720
- len >>>= 0; offset = bigintToI53Checked(offset); allocated >>>= 0; addr >>>= 0; try {
1721
- const stream = SYSCALLS.getStreamFromFD(fd); const res = FS.mmap(stream, len, offset, prot, flags); const ptr = res.ptr; HEAP32[allocated >>> 2 >>> 0] = res.allocated; HEAPU32[addr >>> 2 >>> 0] = ptr; return 0
1722
- } catch (e) {
1723
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1724
- throw e; return -e.errno
1725
- }
1726
- } function __munmap_js(addr, len, prot, flags, fd, offset) {
1727
- addr >>>= 0; len >>>= 0; offset = bigintToI53Checked(offset); try {
1728
- const stream = SYSCALLS.getStreamFromFD(fd); if (prot & 2) {
1729
- SYSCALLS.doMsync(addr, stream, len, flags, offset)
1730
- }
1731
- } catch (e) {
1732
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1733
- throw e; return -e.errno
1734
- }
1735
- } const timers = {}; const handleException = (e) => {
1736
- if (e instanceof ExitStatus || e == 'unwind') {
1737
- return EXITSTATUS
1738
- }quit_(1, e)
1739
- }; const keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; const _proc_exit = (code) => {
1740
- EXITSTATUS = code; if (!keepRuntimeAlive()) {
1741
- Module.onExit?.(code); ABORT = true
1742
- }quit_(code, new ExitStatus(code))
1743
- }; const exitJS = (status, implicit) => {
1744
- EXITSTATUS = status; _proc_exit(status)
1745
- }; const _exit = exitJS; const maybeExit = () => {
1746
- if (!keepRuntimeAlive()) {
1747
- try {
1748
- _exit(EXITSTATUS)
1749
- } catch (e) {
1750
- handleException(e)
1751
- }
1752
- }
1753
- }; const callUserCallback = (func) => {
1754
- if (ABORT) {
1755
- return
1756
- } try {
1757
- return func()
1758
- } catch (e) {
1759
- handleException(e)
1760
- } finally {
1761
- maybeExit()
1762
- }
1763
- }; const _emscripten_get_now = () => performance.now(); const __setitimer_js = (which, timeout_ms) => {
1764
- if (timers[which]) {
1765
- clearTimeout(timers[which].id); delete timers[which]
1766
- } if (!timeout_ms)
1767
- return 0; const id = setTimeout(() => {
1768
- delete timers[which]; callUserCallback(() => __emscripten_timeout(which, _emscripten_get_now()))
1769
- }, timeout_ms); timers[which] = { id, timeout_ms }; return 0
1770
- }; const __tzset_js = function (timezone, daylight, std_name, dst_name) {
1771
- timezone >>>= 0; daylight >>>= 0; std_name >>>= 0; dst_name >>>= 0; const currentYear = (new Date()).getFullYear(); const winter = new Date(currentYear, 0, 1); const summer = new Date(currentYear, 6, 1); const winterOffset = winter.getTimezoneOffset(); const summerOffset = summer.getTimezoneOffset(); const stdTimezoneOffset = Math.max(winterOffset, summerOffset); HEAPU32[timezone >>> 2 >>> 0] = stdTimezoneOffset * 60; HEAP32[daylight >>> 2 >>> 0] = Number(winterOffset != summerOffset); const extractZone = (timezoneOffset) => {
1772
- const sign = timezoneOffset >= 0 ? '-' : '+'; const absOffset = Math.abs(timezoneOffset); const hours = String(Math.floor(absOffset / 60)).padStart(2, '0'); const minutes = String(absOffset % 60).padStart(2, '0'); return `UTC${sign}${hours}${minutes}`
1773
- }; const winterName = extractZone(winterOffset); const summerName = extractZone(summerOffset); if (summerOffset < winterOffset) {
1774
- stringToUTF8(winterName, std_name, 17); stringToUTF8(summerName, dst_name, 17)
1775
- } else {
1776
- stringToUTF8(winterName, dst_name, 17); stringToUTF8(summerName, std_name, 17)
1777
- }
1778
- }; const _emscripten_date_now = () => Date.now(); const nowIsMonotonic = 1; const checkWasiClock = clock_id => clock_id >= 0 && clock_id <= 3; function _clock_time_get(clk_id, ignored_precision, ptime) {
1779
- ignored_precision = bigintToI53Checked(ignored_precision); ptime >>>= 0; if (!checkWasiClock(clk_id)) {
1780
- return 28
1781
- } let now; if (clk_id === 0) {
1782
- now = _emscripten_date_now()
1783
- } else if (nowIsMonotonic) {
1784
- now = _emscripten_get_now()
1785
- } else {
1786
- return 52
1787
- } const nsec = Math.round(now * 1e3 * 1e3); HEAP64[ptime >>> 3 >>> 0] = BigInt(nsec); return 0
1788
- } const getHeapMax = () => 4294901760; const growMemory = (size) => {
1789
- const oldHeapSize = wasmMemory.buffer.byteLength; const pages = (size - oldHeapSize + 65535) / 65536 | 0; try {
1790
- wasmMemory.grow(pages); updateMemoryViews(); return 1
1791
- } catch (e) {}
1792
- }; function _emscripten_resize_heap(requestedSize) {
1793
- requestedSize >>>= 0; const oldSize = HEAPU8.length; const maxHeapSize = getHeapMax(); if (requestedSize > maxHeapSize) {
1794
- return false
1795
- } for (let cutDown = 1; cutDown <= 4; cutDown *= 2) {
1796
- let overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); const newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); const replacement = growMemory(newSize); if (replacement) {
1797
- return true
1798
- }
1799
- } return false
1800
- } const ENV = {}; const getExecutableName = () => thisProgram || './this.program'; const getEnvStrings = () => {
1801
- if (!getEnvStrings.strings) {
1802
- const lang = `${(globalThis.navigator?.language ?? 'C').replace('-', '_')}.UTF-8`; const env = { USER: 'web_user', LOGNAME: 'web_user', PATH: '/', PWD: '/', HOME: '/home/web_user', LANG: lang, _: getExecutableName() }; for (var x in ENV) {
1803
- if (ENV[x] === undefined)
1804
- delete env[x]; else env[x] = ENV[x]
1805
- } const strings = []; for (var x in env) {
1806
- strings.push(`${x}=${env[x]}`)
1807
- }getEnvStrings.strings = strings
1808
- } return getEnvStrings.strings
1809
- }; function _environ_get(__environ, environ_buf) {
1810
- __environ >>>= 0; environ_buf >>>= 0; let bufSize = 0; let envp = 0; for (const string of getEnvStrings()) {
1811
- const ptr = environ_buf + bufSize; HEAPU32[__environ + envp >>> 2 >>> 0] = ptr; bufSize += stringToUTF8(string, ptr, Infinity) + 1; envp += 4
1812
- } return 0
1813
- } function _environ_sizes_get(penviron_count, penviron_buf_size) {
1814
- penviron_count >>>= 0; penviron_buf_size >>>= 0; const strings = getEnvStrings(); HEAPU32[penviron_count >>> 2 >>> 0] = strings.length; let bufSize = 0; for (const string of strings) {
1815
- bufSize += lengthBytesUTF8(string) + 1
1816
- }HEAPU32[penviron_buf_size >>> 2 >>> 0] = bufSize; return 0
1817
- } function _fd_close(fd) {
1818
- try {
1819
- const stream = SYSCALLS.getStreamFromFD(fd); FS.close(stream); return 0
1820
- } catch (e) {
1821
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1822
- throw e; return e.errno
1823
- }
1824
- } function _fd_fdstat_get(fd, pbuf) {
1825
- pbuf >>>= 0; try {
1826
- const rightsBase = 0; const rightsInheriting = 0; const flags = 0; { const stream = SYSCALLS.getStreamFromFD(fd); var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4 }HEAP8[pbuf >>> 0] = type; HEAP16[pbuf + 2 >>> 1 >>> 0] = flags; HEAP64[pbuf + 8 >>> 3 >>> 0] = BigInt(rightsBase); HEAP64[pbuf + 16 >>> 3 >>> 0] = BigInt(rightsInheriting); return 0
1827
- } catch (e) {
1828
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1829
- throw e; return e.errno
1830
- }
1831
- } const doReadv = (stream, iov, iovcnt, offset) => {
1832
- let ret = 0; for (let i = 0; i < iovcnt; i++) {
1833
- const ptr = HEAPU32[iov >>> 2 >>> 0]; const len = HEAPU32[iov + 4 >>> 2 >>> 0]; iov += 8; const curr = FS.read(stream, HEAP8, ptr, len, offset); if (curr < 0)
1834
- return -1; ret += curr; if (curr < len)
1835
- break; if (typeof offset != 'undefined') {
1836
- offset += curr
1837
- }
1838
- } return ret
1839
- }; function _fd_pread(fd, iov, iovcnt, offset, pnum) {
1840
- iov >>>= 0; iovcnt >>>= 0; offset = bigintToI53Checked(offset); pnum >>>= 0; try {
1841
- if (isNaN(offset))
1842
- return 61; const stream = SYSCALLS.getStreamFromFD(fd); const num = doReadv(stream, iov, iovcnt, offset); HEAPU32[pnum >>> 2 >>> 0] = num; return 0
1843
- } catch (e) {
1844
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1845
- throw e; return e.errno
1846
- }
1847
- } function _fd_read(fd, iov, iovcnt, pnum) {
1848
- iov >>>= 0; iovcnt >>>= 0; pnum >>>= 0; try {
1849
- const stream = SYSCALLS.getStreamFromFD(fd); const num = doReadv(stream, iov, iovcnt); HEAPU32[pnum >>> 2 >>> 0] = num; return 0
1850
- } catch (e) {
1851
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1852
- throw e; return e.errno
1853
- }
1854
- } function _fd_seek(fd, offset, whence, newOffset) {
1855
- offset = bigintToI53Checked(offset); newOffset >>>= 0; try {
1856
- if (isNaN(offset))
1857
- return 61; const stream = SYSCALLS.getStreamFromFD(fd); FS.llseek(stream, offset, whence); HEAP64[newOffset >>> 3 >>> 0] = BigInt(stream.position); if (stream.getdents && offset === 0 && whence === 0)
1858
- stream.getdents = null; return 0
1859
- } catch (e) {
1860
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1861
- throw e; return e.errno
1862
- }
1863
- } const doWritev = (stream, iov, iovcnt, offset) => {
1864
- let ret = 0; for (let i = 0; i < iovcnt; i++) {
1865
- const ptr = HEAPU32[iov >>> 2 >>> 0]; const len = HEAPU32[iov + 4 >>> 2 >>> 0]; iov += 8; const curr = FS.write(stream, HEAP8, ptr, len, offset); if (curr < 0)
1866
- return -1; ret += curr; if (curr < len) {
1867
- break
1868
- } if (typeof offset != 'undefined') {
1869
- offset += curr
1870
- }
1871
- } return ret
1872
- }; function _fd_write(fd, iov, iovcnt, pnum) {
1873
- iov >>>= 0; iovcnt >>>= 0; pnum >>>= 0; try {
1874
- const stream = SYSCALLS.getStreamFromFD(fd); const num = doWritev(stream, iov, iovcnt); HEAPU32[pnum >>> 2 >>> 0] = num; return 0
1875
- } catch (e) {
1876
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1877
- throw e; return e.errno
1878
- }
1879
- } function _random_get(buffer, size) {
1880
- buffer >>>= 0; size >>>= 0; try {
1881
- randomFill(HEAPU8.subarray(buffer >>> 0, buffer + size >>> 0)); return 0
1882
- } catch (e) {
1883
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
1884
- throw e; return e.errno
1885
- }
1886
- } const getCFunc = (ident) => {
1887
- const func = Module[`_${ident}`]; return func
1888
- }; const writeArrayToMemory = (array, buffer) => {
1889
- HEAP8.set(array, buffer >>> 0)
1890
- }; const stackAlloc = sz => __emscripten_stack_alloc(sz); const stringToUTF8OnStack = (str) => {
1891
- const size = lengthBytesUTF8(str) + 1; const ret = stackAlloc(size); stringToUTF8(str, ret, size); return ret
1892
- }; const stackSave = () => _emscripten_stack_get_current(); const stackRestore = val => __emscripten_stack_restore(val); const ccall = (ident, returnType, argTypes, args, opts) => {
1893
- const toC = { string: (str) => {
1894
- let ret = 0; if (str !== null && str !== undefined && str !== 0) {
1895
- ret = stringToUTF8OnStack(str)
1896
- } return ret
1897
- }, array: (arr) => {
1898
- const ret = stackAlloc(arr.length); writeArrayToMemory(arr, ret); return ret
1899
- } }; function convertReturnValue(ret) {
1900
- if (returnType === 'string') {
1901
- return UTF8ToString(ret)
1902
- } if (returnType === 'pointer')
1903
- return ret >>> 0; if (returnType === 'boolean')
1904
- return Boolean(ret); return ret
1905
- } const func = getCFunc(ident); const cArgs = []; let stack = 0; if (args) {
1906
- for (let i = 0; i < args.length; i++) {
1907
- const converter = toC[argTypes[i]]; if (converter) {
1908
- if (stack === 0)
1909
- stack = stackSave(); cArgs[i] = converter(args[i])
1910
- } else {
1911
- cArgs[i] = args[i]
1912
- }
1913
- }
1914
- } let ret = func(...cArgs); function onDone(ret) {
1915
- if (stack !== 0)
1916
- stackRestore(stack); return convertReturnValue(ret)
1917
- }ret = onDone(ret); return ret
1918
- }; const FS_createPath = (...args) => FS.createPath(...args); const FS_unlink = (...args) => FS.unlink(...args); const FS_createLazyFile = (...args) => FS.createLazyFile(...args); const FS_createDevice = (...args) => FS.createDevice(...args); FS.createPreloadedFile = FS_createPreloadedFile; FS.preloadFile = FS_preloadFile; FS.staticInit(); { if (Module.noExitRuntime)
1919
- noExitRuntime = Module.noExitRuntime; if (Module.preloadPlugins)
1920
- preloadPlugins = Module.preloadPlugins; if (Module.print)
1921
- out = Module.print; if (Module.printErr)
1922
- err = Module.printErr; if (Module.wasmBinary)
1923
- wasmBinary = Module.wasmBinary; if (Module.arguments)
1924
- arguments_ = Module.arguments; if (Module.thisProgram)
1925
- thisProgram = Module.thisProgram; if (Module.preInit) {
1926
- if (typeof Module.preInit == 'function')
1927
- Module.preInit = [Module.preInit]; while (Module.preInit.length > 0) {
1928
- Module.preInit.shift()()
1929
- }
1930
- } }Module.addRunDependency = addRunDependency; Module.removeRunDependency = removeRunDependency; Module.ccall = ccall; Module.FS_preloadFile = FS_preloadFile; Module.FS_unlink = FS_unlink; Module.FS_createPath = FS_createPath; Module.FS_createDevice = FS_createDevice; Module.FS = FS; Module.FS_createDataFile = FS_createDataFile; Module.FS_createLazyFile = FS_createLazyFile; let _free, _malloc, _rime_wasm_init, _rime_wasm_process_input, _rime_wasm_pick_candidate, _rime_wasm_flip_page, _rime_wasm_clear_input, _rime_wasm_set_option, _rime_wasm_get_version, _rime_wasm_destroy, _emscripten_builtin_memalign, __emscripten_timeout, ___trap, __emscripten_stack_restore, __emscripten_stack_alloc, _emscripten_stack_get_current, memory, __indirect_function_table, wasmMemory; function assignWasmExports(wasmExports) {
1931
- _free = Module._free = wasmExports.R; _malloc = Module._malloc = wasmExports.S; _rime_wasm_init = Module._rime_wasm_init = wasmExports.T; _rime_wasm_process_input = Module._rime_wasm_process_input = wasmExports.U; _rime_wasm_pick_candidate = Module._rime_wasm_pick_candidate = wasmExports.V; _rime_wasm_flip_page = Module._rime_wasm_flip_page = wasmExports.W; _rime_wasm_clear_input = Module._rime_wasm_clear_input = wasmExports.X; _rime_wasm_set_option = Module._rime_wasm_set_option = wasmExports.Y; _rime_wasm_get_version = Module._rime_wasm_get_version = wasmExports.Z; _rime_wasm_destroy = Module._rime_wasm_destroy = wasmExports._; _emscripten_builtin_memalign = wasmExports.$; __emscripten_timeout = wasmExports.aa; ___trap = wasmExports.ba; __emscripten_stack_restore = wasmExports.ca; __emscripten_stack_alloc = wasmExports.da; _emscripten_stack_get_current = wasmExports.ea; memory = wasmMemory = wasmExports.P; __indirect_function_table = wasmExports.__indirect_function_table
1932
- } var wasmImports = { r: ___syscall_chmod, k: ___syscall_faccessat, s: ___syscall_fchmod, c: ___syscall_fcntl64, j: ___syscall_fdatasync, N: ___syscall_fstat64, q: ___syscall_ftruncate64, u: ___syscall_getcwd, A: ___syscall_getdents64, O: ___syscall_ioctl, L: ___syscall_lstat64, G: ___syscall_mkdirat, K: ___syscall_newfstatat, d: ___syscall_openat, v: ___syscall_readlinkat, z: ___syscall_renameat, i: ___syscall_rmdir, M: ___syscall_stat64, t: ___syscall_truncate64, h: ___syscall_unlinkat, l: __abort_js, n: __emscripten_runtime_keepalive_clear, E: __localtime_js, C: __mmap_js, D: __munmap_js, o: __setitimer_js, F: __tzset_js, w: _clock_time_get, e: _emscripten_date_now, b: _emscripten_get_now, x: _emscripten_resize_heap, I: _environ_get, J: _environ_sizes_get, a: _fd_close, y: _fd_fdstat_get, B: _fd_pread, g: _fd_read, H: _fd_seek, f: _fd_write, m: _proc_exit, p: _random_get }; function applySignatureConversions(wasmExports) {
1933
- wasmExports = Object.assign({}, wasmExports); const makeWrapper_pp = f => a0 => f(a0) >>> 0; const makeWrapper_ppp = f => (a0, a1) => f(a0, a1) >>> 0; const makeWrapper_p = f => () => f() >>> 0; wasmExports.S = makeWrapper_pp(wasmExports.S); wasmExports.$ = makeWrapper_ppp(wasmExports.$); wasmExports.da = makeWrapper_pp(wasmExports.da); wasmExports.ea = makeWrapper_p(wasmExports.ea); return wasmExports
1934
- } function run() {
1935
- if (runDependencies > 0) {
1936
- dependenciesFulfilled = run; return
1937
- }preRun(); if (runDependencies > 0) {
1938
- dependenciesFulfilled = run; return
1939
- } function doRun() {
1940
- Module.calledRun = true; if (ABORT)
1941
- return; initRuntime(); readyPromiseResolve?.(Module); Module.onRuntimeInitialized?.(); postRun()
1942
- } if (Module.setStatus) {
1943
- Module.setStatus('Running...'); setTimeout(() => {
1944
- setTimeout(() => Module.setStatus(''), 1); doRun()
1945
- }, 1)
1946
- } else {
1947
- doRun()
1948
- }
1949
- } let wasmExports; wasmExports = await (createWasm()); run(); if (runtimeInitialized) {
1950
- moduleRtn = Module
1951
- } else {
1952
- moduleRtn = new Promise((resolve, reject) => {
1953
- readyPromiseResolve = resolve; readyPromiseReject = reject
1954
- })
1955
- }
1956
- ;return moduleRtn
1957
- } export default createRimeModule
1
+ async function createRimeModule(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;if(!Module["expectedDataFileDownloads"])Module["expectedDataFileDownloads"]=0;Module["expectedDataFileDownloads"]++;(()=>{var isPthread=typeof ENVIRONMENT_IS_PTHREAD!="undefined"&&ENVIRONMENT_IS_PTHREAD;var isWasmWorker=typeof ENVIRONMENT_IS_WASM_WORKER!="undefined"&&ENVIRONMENT_IS_WASM_WORKER;if(isPthread||isWasmWorker)return;async function loadPackage(metadata){var PACKAGE_PATH="";if(typeof window==="object"){PACKAGE_PATH=window["encodeURIComponent"](window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+"/")}else if(typeof process==="undefined"&&typeof location!=="undefined"){PACKAGE_PATH=encodeURIComponent(location.pathname.substring(0,location.pathname.lastIndexOf("/"))+"/")}var PACKAGE_NAME="/home/zzx/work/librime/wasm/dist/rime-api.data";var REMOTE_PACKAGE_BASE="rime-api.data";var REMOTE_PACKAGE_NAME=Module["locateFile"]?Module["locateFile"](REMOTE_PACKAGE_BASE,""):REMOTE_PACKAGE_BASE;var REMOTE_PACKAGE_SIZE=metadata["remote_package_size"];async function fetchRemotePackage(packageName,packageSize){if(!Module["dataFileDownloads"])Module["dataFileDownloads"]={};try{var response=await fetch(packageName)}catch(e){throw new Error(`Network Error: ${packageName}`,{e})}if(!response.ok){throw new Error(`${response.status}: ${response.url}`)}const chunks=[];const headers=response.headers;const total=Number(headers.get("Content-Length")||packageSize);let loaded=0;Module["setStatus"]&&Module["setStatus"]("Downloading data...");const reader=response.body.getReader();while(1){var{done,value}=await reader.read();if(done)break;chunks.push(value);loaded+=value.length;Module["dataFileDownloads"][packageName]={loaded,total};let totalLoaded=0;let totalSize=0;for(const download of Object.values(Module["dataFileDownloads"])){totalLoaded+=download.loaded;totalSize+=download.total}Module["setStatus"]&&Module["setStatus"](`Downloading data... (${totalLoaded}/${totalSize})`)}const packageData=new Uint8Array(chunks.map(c=>c.length).reduce((a,b)=>a+b,0));let offset=0;for(const chunk of chunks){packageData.set(chunk,offset);offset+=chunk.length}return packageData.buffer}var fetchPromise;var fetched=Module["getPreloadedPackage"]&&Module["getPreloadedPackage"](REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE);if(!fetched){fetchPromise=fetchRemotePackage(REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE)}async function runWithFS(Module){function assert(check,msg){if(!check)throw new Error(msg)}Module["FS_createPath"]("/","rime",true,true);Module["FS_createPath"]("/rime","opencc",true,true);for(var file of metadata["files"]){var name=file["filename"];Module["addRunDependency"](`fp ${name}`)}async function processPackageData(arrayBuffer){assert(arrayBuffer,"Loading data file failed.");assert(arrayBuffer.constructor.name===ArrayBuffer.name,"bad input to processPackageData "+arrayBuffer.constructor.name);var byteArray=new Uint8Array(arrayBuffer);for(var file of metadata["files"]){var name=file["filename"];var data=byteArray.subarray(file["start"],file["end"]);Module["FS_createDataFile"](name,null,data,true,true,true);Module["removeRunDependency"](`fp ${name}`)}Module["removeRunDependency"]("datafile_/home/zzx/work/librime/wasm/dist/rime-api.data")}Module["addRunDependency"]("datafile_/home/zzx/work/librime/wasm/dist/rime-api.data");if(!Module["preloadResults"])Module["preloadResults"]={};Module["preloadResults"][PACKAGE_NAME]={fromCache:false};if(!fetched){fetched=await fetchPromise}processPackageData(fetched)}if(Module["calledRun"]){runWithFS(Module)}else{if(!Module["preRun"])Module["preRun"]=[];Module["preRun"].push(runWithFS)}}loadPackage({files:[{filename:"/rime/opencc/STCharacters.ocd2",start:0,end:45310},{filename:"/rime/opencc/STPhrases.ocd2",start:45310,end:971027},{filename:"/rime/opencc/TSCharacters.ocd2",start:971027,end:1017153},{filename:"/rime/opencc/TSPhrases.ocd2",start:1017153,end:1026935},{filename:"/rime/opencc/s2t.json",start:1026935,end:1027341},{filename:"/rime/opencc/t2s.json",start:1027341,end:1027747}],remote_package_size:1027747})})();var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var readyPromiseResolve,readyPromiseReject;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["Q"]();FS.ignorePermissions=false}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";if(runtimeInitialized){___trap()}var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("rime-api.wasm")}return new URL("rime-api.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=applySignatureConversions(wasmExports);assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>view=>crypto.getRandomValues(view);var randomFill=view=>{(randomFill=initRandomFill())(view)};var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start<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 UTF8Decoder=new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{idx>>>=0;var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(heapOrArray.buffer?heapOrArray.subarray(idx,endPtr):new Uint8Array(heapOrArray.slice(idx,endPtr)))};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};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{outIdx>>>=0;if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.codePointAt(i);if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++>>>0]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++>>>0]=192|u>>6;heap[outIdx++>>>0]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++>>>0]=224|u>>12;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++>>>0]=240|u>>18;heap[outIdx++>>>0]=128|u>>12&63;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63;i++}}heap[outIdx>>>0]=0;return outIdx-startIdx};var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(globalThis.window?.prompt){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;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.atime=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.mtime=stream.node.ctime=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));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var zeroMemory=(ptr,size)=>HEAPU8.fill(0,ptr,ptr+size);var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(ptr)zeroMemory(ptr,size);return ptr};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=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.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){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.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){if(!MEMFS.doesNotExistError){MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack="<generic error, no stack>"}throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);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.mtime=node.ctime=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},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&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}if(contents){if(position>0||position+length<contents.length){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}HEAP8.set(contents,ptr>>>0)}}return{ptr,allocated}},msync(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var FS_modeStringToFlags=str=>{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 IDBFS={dbs:{},indexedDB:()=>indexedDB,DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",queuePersist:mount=>{function onPersistComplete(){if(mount.idbPersistState==="again")startPersist();else mount.idbPersistState=0}function startPersist(){mount.idbPersistState="idb";IDBFS.syncfs(mount,false,onPersistComplete)}if(!mount.idbPersistState){mount.idbPersistState=setTimeout(startPersist,0)}else if(mount.idbPersistState==="idb"){mount.idbPersistState="again"}},mount:mount=>{var mnt=MEMFS.mount(mount);if(mount?.opts?.autoPersist){mount.idbPersistState=0;var memfs_node_ops=mnt.node_ops;mnt.node_ops={...mnt.node_ops};mnt.node_ops.mknod=(parent,name,mode,dev)=>{var node=memfs_node_ops.mknod(parent,name,mode,dev);node.node_ops=mnt.node_ops;node.idbfs_mount=mnt.mount;node.memfs_stream_ops=node.stream_ops;node.stream_ops={...node.stream_ops};node.stream_ops.write=(stream,buffer,offset,length,position,canOwn)=>{stream.node.isModified=true;return node.memfs_stream_ops.write(stream,buffer,offset,length,position,canOwn)};node.stream_ops.close=stream=>{var n=stream.node;if(n.isModified){IDBFS.queuePersist(n.idbfs_mount);n.isModified=false}if(n.memfs_stream_ops.close)return n.memfs_stream_ops.close(stream)};IDBFS.queuePersist(mnt.mount);return node};mnt.node_ops.rmdir=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.rmdir(...args));mnt.node_ops.symlink=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.symlink(...args));mnt.node_ops.unlink=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.unlink(...args));mnt.node_ops.rename=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.rename(...args))}return mnt},syncfs:(mount,populate,callback)=>{IDBFS.getLocalSet(mount,(err,local)=>{if(err)return callback(err);IDBFS.getRemoteSet(mount,(err,remote)=>{if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)})})},quit:()=>{for(var value of Object.values(IDBFS.dbs)){value.close()}IDBFS.dbs={}},getDB:(name,callback)=>{var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback("Unable to connect to IndexedDB")}req.onupgradeneeded=e=>{var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}};req.onsuccess=()=>{db=req.result;IDBFS.dbs[name]=db;callback(null,db)};req.onerror=e=>{callback(e.target.error);e.preventDefault()}},getLocalSet:(mount,callback)=>{var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return p=>PATH.join2(root,p)}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push(...FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={timestamp:stat.mtime}}return callback(null,{type:"local",entries})},getRemoteSet:(mount,callback)=>{var entries={};IDBFS.getDB(mount.mountpoint,(err,db)=>{if(err)return callback(err);try{var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=e=>{callback(e.target.error);e.preventDefault()};var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=event=>{var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db,entries})}entries[cursor.primaryKey]={timestamp:cursor.key};cursor.continue()}}catch(e){return callback(e)}})},loadLocalEntry:(path,callback)=>{var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{timestamp:stat.mtime,mode:stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{timestamp:stat.mtime,mode:stat.mode,contents:node.contents})}else{return callback(new Error("node type not supported"))}},storeLocalEntry:(path,entry,callback)=>{try{if(FS.isDir(entry["mode"])){FS.mkdirTree(path,entry["mode"])}else if(FS.isFile(entry["mode"])){FS.writeFile(path,entry["contents"],{canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry["mode"]);FS.utime(path,entry["timestamp"],entry["timestamp"])}catch(e){return callback(e)}callback(null)},removeLocalEntry:(path,callback)=>{try{var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)},loadRemoteEntry:(store,path,callback)=>{var req=store.get(path);req.onsuccess=event=>callback(null,event.target.result);req.onerror=e=>{callback(e.target.error);e.preventDefault()}},storeRemoteEntry:(store,path,entry,callback)=>{try{var req=store.put(entry,path)}catch(e){callback(e);return}req.onsuccess=event=>callback();req.onerror=e=>{callback(e.target.error);e.preventDefault()}},removeRemoteEntry:(store,path,callback)=>{var req=store.delete(path);req.onsuccess=event=>callback();req.onerror=e=>{callback(e.target.error);e.preventDefault()}},reconcile:(src,dst,callback)=>{var total=0;var create=[];for(var[key,e]of Object.entries(src.entries)){var e2=dst.entries[key];if(!e2||e["timestamp"].getTime()!=e2["timestamp"].getTime()){create.push(key);total++}}var remove=[];for(var key of Object.keys(dst.entries)){if(!src.entries[key]){remove.push(key);total++}}if(!total){return callback(null)}var errored=false;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err&&!errored){errored=true;return callback(err)}}transaction.onerror=transaction.onabort=e=>{done(e.target.error);e.preventDefault()};transaction.oncomplete=e=>{if(!errored){callback(null)}};for(const path of create.sort()){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(err,entry)=>{if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)})}else{IDBFS.loadLocalEntry(path,(err,entry)=>{if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)})}}for(var path of remove.sort().reverse()){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}}};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(...args)=>FS.createDataFile(...args);var getUniqueRunDependency=id=>id;var runDependencies=0;var dependenciesFulfilled=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}};var addRunDependency=id=>{runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)};var preloadPlugins=[];var FS_handledByPreloadPlugin=async(byteArray,fullname)=>{if(typeof Browser!="undefined")Browser.init();for(var plugin of preloadPlugins){if(plugin["canHandle"](fullname)){return plugin["handle"](byteArray,fullname)}}return byteArray};var FS_preloadFile=async(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);addRunDependency(dep);try{var byteArray=url;if(typeof url=="string"){byteArray=await asyncLoad(url)}byteArray=await FS_handledByPreloadPlugin(byteArray,fullname);preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}}finally{removeRunDependency(dep)}};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{FS_preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish).then(onload).catch(onerror)};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}if(parts[i]==="."){continue}if(parts[i]===".."){current_path=PATH.dirname(current_path);if(FS.isRoot(current)){path=current_path+"/"+parts.slice(i+1).join("/");nlinks--;continue linkloop}else{current=current.parent}continue}current_path=PATH.join2(current_path,parts[i]);try{current=FS.lookupNode(current,parts[i])}catch(e){if(e?.errno===44&&islast&&opts.noent_okay){return{path:current_path}}throw e}if(FS.isMountpoint(current)&&(!islast||opts.follow_mount)){current=current.mounted.root}if(FS.isLink(current.mode)&&(!islast||opts.follow)){if(!current.node_ops.readlink){throw new FS.ErrnoError(52)}var link=current.node_ops.readlink(current);if(!PATH.isAbs(link)){link=PATH.dirname(current_path)+"/"+link}path=link+"/"+parts.slice(i+1).join("/");continue linkloop}}return{path:current_path,node:current}}throw new FS.ErrnoError(32)},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}if(perms.includes("w")&&!(node.mode&146)){return 2}if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else if(FS.isDir(node.mode)){return 31}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}var mode=FS.flagsToPermissionString(flags);if(FS.isDir(node.mode)){if(mode!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,mode)},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);setattr(arg,attr)},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}for(var mount of mounts){if(mount.type.syncfs){mount.type.syncfs(mount,populate,done)}else{done(null)}}},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);for(var[hash,current]of Object.entries(FS.nameTable)){while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var setattr=FS.checkOpExists(node.node_ops.setattr,63);setattr(node,{atime,mtime})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){abort(`Invalid encoding type "${opts.encoding}"`)}var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){buf=UTF8ArrayToString(buf)}FS.close(stream);return buf},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){data=new Uint8Array(intArrayFromString(data,true))}if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{abort("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,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS,IDBFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){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);FS.createDevice.major??=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open(stream){stream.seekable=false},close(stream){if(output?.buffer?.length){output(10)}},read(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;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.atime=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.mtime=stream.node.ctime=Date.now()}return i}});return FS.mkdev(path,mode,dev)},forceLoadFile(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(globalThis.XMLHttpRequest){abort("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{try{obj.contents=readBinary(obj.url)}catch(e){throw new FS.ErrnoError(29)}}},createLazyFile(parent,name,url,canRead,canWrite){class LazyUint8Array{lengthKnown=false;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))abort("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)abort("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)abort("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")abort("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(globalThis.XMLHttpRequest){if(!ENVIRONMENT_IS_WORKER)abort("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};for(const[key,fn]of Object.entries(node.stream_ops)){stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}}function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i<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,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>{ptr>>>=0;if(!ptr)return"";var end=findStringEnd(HEAPU8,ptr,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(HEAPU8.subarray(ptr>>>0,end>>>0))};var SYSCALLS={calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){HEAPU32[buf>>>2>>>0]=stat.dev;HEAPU32[buf+4>>>2>>>0]=stat.mode;HEAPU32[buf+8>>>2>>>0]=stat.nlink;HEAPU32[buf+12>>>2>>>0]=stat.uid;HEAPU32[buf+16>>>2>>>0]=stat.gid;HEAPU32[buf+20>>>2>>>0]=stat.rdev;HEAP64[buf+24>>>3>>>0]=BigInt(stat.size);HEAP32[buf+32>>>2>>>0]=4096;HEAP32[buf+36>>>2>>>0]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>>3>>>0]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>>2>>>0]=atime%1e3*1e3*1e3;HEAP64[buf+56>>>3>>>0]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>>2>>>0]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>>3>>>0]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>>2>>>0]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>>3>>>0]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){HEAPU32[buf+4>>>2>>>0]=stats.bsize;HEAPU32[buf+60>>>2>>>0]=stats.bsize;HEAP64[buf+8>>>3>>>0]=BigInt(stats.blocks);HEAP64[buf+16>>>3>>>0]=BigInt(stats.bfree);HEAP64[buf+24>>>3>>>0]=BigInt(stats.bavail);HEAP64[buf+32>>>3>>>0]=BigInt(stats.files);HEAP64[buf+40>>>3>>>0]=BigInt(stats.ffree);HEAPU32[buf+48>>>2>>>0]=stats.fsid;HEAPU32[buf+64>>>2>>>0]=stats.flags;HEAPU32[buf+56>>>2>>>0]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>num<INT53_MIN||num>INT53_MAX?NaN:Number(num);function ___syscall_chmod(path,mode){path>>>=0;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_faccessat(dirfd,path,amode,flags){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fchmod(fd,mode){try{FS.fchmod(fd,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>>2>>>0];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;function ___syscall_fcntl64(fd,cmd,varargs){varargs>>>=0;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>>>0]=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){buf>>>=0;try{return SYSCALLS.writeStat(buf,FS.fstat(fd))}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ftruncate64(fd,length){length=bigintToI53Checked(length);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);function ___syscall_getcwd(buf,size){buf>>>=0;size>>>=0;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){dirp>>>=0;count>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);stream.getdents||=FS.readdir(stream.path);var struct_size=280;var pos=0;var off=FS.llseek(stream,0,1);var startIdx=Math.floor(off/struct_size);var endIdx=Math.min(stream.getdents.length,startIdx+Math.floor(count/struct_size));for(var idx=startIdx;idx<endIdx;idx++){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;try{child=FS.lookupNode(stream.node,name)}catch(e){if(e?.errno===28){continue}throw e}id=child.id;type=FS.isChrdev(child.mode)?2:FS.isDir(child.mode)?4:FS.isLink(child.mode)?10:8}HEAP64[dirp+pos>>>3>>>0]=BigInt(id);HEAP64[dirp+pos+8>>>3>>>0]=BigInt((idx+1)*struct_size);HEAP16[dirp+pos+16>>>1>>>0]=280;HEAP8[dirp+pos+18>>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){varargs>>>=0;SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>>2>>>0]=termios.c_iflag||0;HEAP32[argp+4>>>2>>>0]=termios.c_oflag||0;HEAP32[argp+8>>>2>>>0]=termios.c_cflag||0;HEAP32[argp+12>>>2>>>0]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>>2>>>0];var c_oflag=HEAP32[argp+4>>>2>>>0];var c_cflag=HEAP32[argp+8>>>2>>>0];var c_lflag=HEAP32[argp+12>>>2>>>0];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>>2>>>0]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21537:case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>>1>>>0]=winsize[0];HEAP16[argp+2>>>1>>>0]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){path>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);return SYSCALLS.writeStat(buf,FS.lstat(path))}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);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){path>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~6400;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.writeStat(buf,nofollow?FS.lstat(path):FS.stat(path))}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){path>>>=0;varargs>>>=0;SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_readlinkat(dirfd,path,buf,bufsize){path>>>=0;buf>>>=0;bufsize>>>=0;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>>>0];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len>>>0]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){oldpath>>>=0;newpath>>>=0;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){path>>>=0;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_stat64(path,buf){path>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);return SYSCALLS.writeStat(buf,FS.stat(path))}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_truncate64(path,length){path>>>=0;length=bigintToI53Checked(length);try{if(isNaN(length))return-61;path=SYSCALLS.getStr(path);FS.truncate(path,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(!flags){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{return-28}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};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,tmPtr){time=bigintToI53Checked(time);tmPtr>>>=0;var date=new Date(time*1e3);HEAP32[tmPtr>>>2>>>0]=date.getSeconds();HEAP32[tmPtr+4>>>2>>>0]=date.getMinutes();HEAP32[tmPtr+8>>>2>>>0]=date.getHours();HEAP32[tmPtr+12>>>2>>>0]=date.getDate();HEAP32[tmPtr+16>>>2>>>0]=date.getMonth();HEAP32[tmPtr+20>>>2>>>0]=date.getFullYear()-1900;HEAP32[tmPtr+24>>>2>>>0]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>>2>>>0]=yday;HEAP32[tmPtr+36>>>2>>>0]=-(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>>>0]=dst}function __mmap_js(len,prot,flags,fd,offset,allocated,addr){len>>>=0;offset=bigintToI53Checked(offset);allocated>>>=0;addr>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>>2>>>0]=res.allocated;HEAPU32[addr>>>2>>>0]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset){addr>>>=0;len>>>=0;offset=bigintToI53Checked(offset);try{var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{return func()}catch(e){handleException(e)}finally{maybeExit()}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};var __tzset_js=function(timezone,daylight,std_name,dst_name){timezone>>>=0;daylight>>>=0;std_name>>>=0;dst_name>>>=0;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>>>0]=stdTimezoneOffset*60;HEAP32[daylight>>>2>>>0]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);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 nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);ptime>>>=0;if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP64[ptime>>>3>>>0]=BigInt(nsec);return 0}var getHeapMax=()=>4294901760;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};function _emscripten_resize_heap(requestedSize){requestedSize>>>=0;var oldSize=HEAPU8.length;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false}var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};function _environ_get(__environ,environ_buf){__environ>>>=0;environ_buf>>>=0;var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>>2>>>0]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){penviron_count>>>=0;penviron_buf_size>>>=0;var strings=getEnvStrings();HEAPU32[penviron_count>>>2>>>0]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>>2>>>0]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){pbuf>>>=0;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>>>0]=type;HEAP16[pbuf+2>>>1>>>0]=flags;HEAP64[pbuf+8>>>3>>>0]=BigInt(rightsBase);HEAP64[pbuf+16>>>3>>>0]=BigInt(rightsInheriting);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<iovcnt;i++){var ptr=HEAPU32[iov>>>2>>>0];var len=HEAPU32[iov+4>>>2>>>0];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break;if(typeof offset!="undefined"){offset+=curr}}return ret};function _fd_pread(fd,iov,iovcnt,offset,pnum){iov>>>=0;iovcnt>>>=0;offset=bigintToI53Checked(offset);pnum>>>=0;try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt,offset);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){iov>>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);newOffset>>>=0;try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>>3>>>0]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>>2>>>0];var len=HEAPU32[iov+4>>>2>>>0];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len){break}if(typeof offset!="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){iov>>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _random_get(buffer,size){buffer>>>=0;size>>>=0;try{randomFill(HEAPU8.subarray(buffer>>>0,buffer+size>>>0));return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer>>>0)};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var 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==="pointer")return ret>>>0;if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<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)}ret=onDone(ret);return ret};var FS_createPath=(...args)=>FS.createPath(...args);var FS_unlink=(...args)=>FS.unlink(...args);var FS_createLazyFile=(...args)=>FS.createLazyFile(...args);var FS_createDevice=(...args)=>FS.createDevice(...args);FS.createPreloadedFile=FS_createPreloadedFile;FS.preloadFile=FS_preloadFile;FS.staticInit();{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["preloadPlugins"])preloadPlugins=Module["preloadPlugins"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["ccall"]=ccall;Module["FS_preloadFile"]=FS_preloadFile;Module["FS_unlink"]=FS_unlink;Module["FS_createPath"]=FS_createPath;Module["FS_createDevice"]=FS_createDevice;Module["FS"]=FS;Module["FS_createDataFile"]=FS_createDataFile;Module["FS_createLazyFile"]=FS_createLazyFile;var _free,_malloc,_rime_wasm_init,_rime_wasm_process_input,_rime_wasm_pick_candidate,_rime_wasm_flip_page,_rime_wasm_clear_input,_rime_wasm_set_option,_rime_wasm_get_version,_rime_wasm_destroy,_emscripten_builtin_memalign,__emscripten_timeout,___trap,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_free=Module["_free"]=wasmExports["R"];_malloc=Module["_malloc"]=wasmExports["S"];_rime_wasm_init=Module["_rime_wasm_init"]=wasmExports["T"];_rime_wasm_process_input=Module["_rime_wasm_process_input"]=wasmExports["U"];_rime_wasm_pick_candidate=Module["_rime_wasm_pick_candidate"]=wasmExports["V"];_rime_wasm_flip_page=Module["_rime_wasm_flip_page"]=wasmExports["W"];_rime_wasm_clear_input=Module["_rime_wasm_clear_input"]=wasmExports["X"];_rime_wasm_set_option=Module["_rime_wasm_set_option"]=wasmExports["Y"];_rime_wasm_get_version=Module["_rime_wasm_get_version"]=wasmExports["Z"];_rime_wasm_destroy=Module["_rime_wasm_destroy"]=wasmExports["_"];_emscripten_builtin_memalign=wasmExports["$"];__emscripten_timeout=wasmExports["aa"];___trap=wasmExports["ba"];__emscripten_stack_restore=wasmExports["ca"];__emscripten_stack_alloc=wasmExports["da"];_emscripten_stack_get_current=wasmExports["ea"];memory=wasmMemory=wasmExports["P"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={r:___syscall_chmod,k:___syscall_faccessat,s:___syscall_fchmod,c:___syscall_fcntl64,j:___syscall_fdatasync,N:___syscall_fstat64,q:___syscall_ftruncate64,u:___syscall_getcwd,A:___syscall_getdents64,O:___syscall_ioctl,L:___syscall_lstat64,G:___syscall_mkdirat,K:___syscall_newfstatat,d:___syscall_openat,v:___syscall_readlinkat,z:___syscall_renameat,i:___syscall_rmdir,M:___syscall_stat64,t:___syscall_truncate64,h:___syscall_unlinkat,l:__abort_js,n:__emscripten_runtime_keepalive_clear,E:__localtime_js,C:__mmap_js,D:__munmap_js,o:__setitimer_js,F:__tzset_js,w:_clock_time_get,e:_emscripten_date_now,b:_emscripten_get_now,x:_emscripten_resize_heap,I:_environ_get,J:_environ_sizes_get,a:_fd_close,y:_fd_fdstat_get,B:_fd_pread,g:_fd_read,H:_fd_seek,f:_fd_write,m:_proc_exit,p:_random_get};function applySignatureConversions(wasmExports){wasmExports=Object.assign({},wasmExports);var makeWrapper_pp=f=>a0=>f(a0)>>>0;var makeWrapper_ppp=f=>(a0,a1)=>f(a0,a1)>>>0;var makeWrapper_p=f=>()=>f()>>>0;wasmExports["S"]=makeWrapper_pp(wasmExports["S"]);wasmExports["$"]=makeWrapper_ppp(wasmExports["$"]);wasmExports["da"]=makeWrapper_pp(wasmExports["da"]);wasmExports["ea"]=makeWrapper_p(wasmExports["ea"]);return wasmExports}function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=await (createWasm());run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})}
2
+ ;return moduleRtn}export default createRimeModule;