Skip to content

Instantly share code, notes, and snippets.

@krishna2nd
Created March 16, 2017 03:17
Show Gist options
  • Save krishna2nd/c328e2169d8cb9dbed60d0fe7c5952c0 to your computer and use it in GitHub Desktop.
Save krishna2nd/c328e2169d8cb9dbed60d0fe7c5952c0 to your computer and use it in GitHub Desktop.
Web Assembly
var UnityLoader = UnityLoader || {
compatibilityCheck: function(e, t, r) {
UnityLoader.SystemInfo.hasWebGL ? UnityLoader.SystemInfo.mobile ? e.popup("Please note that Unity WebGL is not currently supported on mobiles. Press OK if you wish to continue anyway.", [{
text: "OK",
callback: t
}]) : ["Firefox", "Chrome", "Safari"].indexOf(UnityLoader.SystemInfo.browser) == -1 ? e.popup("Please note that your browser is not currently supported for this Unity WebGL content. Press OK if you wish to continue anyway.", [{
text: "OK",
callback: t
}]) : t() : e.popup("Your browser does not support WebGL", [{
text: "OK",
callback: r
}])
},
Blobs: {},
loadCode: function(e, t, r) {
var n = [].slice.call(UnityLoader.Cryptography.md5(e)).map(function(e) {
return ("0" + e.toString(16)).substr(-2)
}).join("")
, o = document.createElement("script")
, a = URL.createObjectURL(new Blob(['UnityLoader["' + n + '"]=', e],{
type: "text/javascript"
}));
UnityLoader.Blobs[a] = r,
o.src = a,
o.onload = function() {
URL.revokeObjectURL(a),
t(n)
}
,
document.body.appendChild(o)
},
allocateHeapJob: function(e, t) {
for (var r = e.TOTAL_STACK || 5242880, n = e.TOTAL_MEMORY || (e.buffer ? e.buffer.byteLength : 268435456), o = 65536, a = 16777216, i = o; i < n || i < 2 * r; )
i += i < a ? i : a;
i != n && e.printErr("increasing TOTAL_MEMORY to " + i + " to be compliant with the asm.js spec (and given that TOTAL_STACK=" + r + ")"),
n = i,
t.parameters.useWasm ? (e.wasmMemory = new WebAssembly.Memory({
initial: n / o,
maximum: n / o
}),
e.buffer = e.wasmMemory.buffer) : e.buffer ? e.buffer.byteLength != n && (e.printErr("provided buffer should be " + n + " bytes, but it is " + e.buffer.byteLength + ", reallocating the buffer"),
e.buffer = new ArrayBuffer(n)) : e.buffer = new ArrayBuffer(n),
e.TOTAL_MEMORY = e.buffer.byteLength,
t.complete()
},
setupIndexedDBJob: function(e, t) {
function r(n) {
r.called || (r.called = !0,
e.indexedDB = n,
t.complete())
}
try {
var n = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB
, o = n.open("/idbfs-test");
o.onerror = function(e) {
e.preventDefault(),
r()
}
,
o.onsuccess = function() {
o.result.close(),
r(n)
}
,
setTimeout(r, 1e3)
} catch (e) {
r()
}
},
processWasmCodeJob: function(e, t) {
e.wasmBinary = UnityLoader.Job.result(e, "downloadWasmCode"),
t.complete()
},
processWasmFrameworkJob: function(e, t) {
UnityLoader.loadCode(UnityLoader.Job.result(e, "downloadWasmFramework"), function(r) {
UnityLoader[r](e),
t.complete()
}, {
Module: e,
url: e.wasmFrameworkUrl
})
},
processAsmCodeJob: function(e, t) {
var r = UnityLoader.Job.result(e, "downloadAsmCode");
UnityLoader.loadCode(Math.fround ? r : UnityLoader.Utils.optimizeMathFround(r), function(r) {
e.asm = UnityLoader[r],
t.complete()
}, {
Module: e,
url: e.asmCodeUrl
})
},
processAsmFrameworkJob: function(e, t) {
UnityLoader.loadCode(UnityLoader.Job.result(e, "downloadAsmFramework"), function(r) {
UnityLoader[r](e),
t.complete()
}, {
Module: e,
url: e.asmFrameworkUrl
})
},
processAsmMemoryJob: function(e, t) {
e.memoryInitializerRequest.status = 200,
e.memoryInitializerRequest.response = UnityLoader.Job.result(e, "downloadAsmMemory"),
e.memoryInitializerRequest.callback && e.memoryInitializerRequest.callback(),
t.complete()
},
processDataJob: function(e, t) {
var r = UnityLoader.Job.result(e, "downloadData")
, n = new DataView(r.buffer,r.byteOffset,r.byteLength)
, o = 0
, a = "UnityWebData1.0\0";
if (!String.fromCharCode.apply(null, r.subarray(o, o + a.length)) == a)
throw "unknown data format";
o += a.length;
var i = n.getUint32(o, !0);
for (o += 4; o < i; ) {
var s = n.getUint32(o, !0);
o += 4;
var d = n.getUint32(o, !0);
o += 4;
var l = n.getUint32(o, !0);
o += 4;
var f = String.fromCharCode.apply(null, r.subarray(o, o + l));
o += l;
for (var u = 0, c = f.indexOf("/", u) + 1; c > 0; u = c,
c = f.indexOf("/", u) + 1)
e.FS_createPath(f.substring(0, u), f.substring(u, c - 1), !0, !0);
e.FS_createDataFile(f, null, r.subarray(s, s + d), !0, !0, !0)
}
e.removeRunDependency("processDataJob"),
t.complete()
},
downloadJob: function(e, t) {
var r = new XMLHttpRequest;
r.open("GET", t.parameters.url),
r.responseType = "arraybuffer",
r.onload = function() {
UnityLoader.Compression.decompress(new Uint8Array(r.response), function(e) {
t.complete(e)
})
}
,
t.parameters.onprogress && r.addEventListener("progress", t.parameters.onprogress),
t.parameters.onload && r.addEventListener("load", t.parameters.onload),
r.send()
},
scheduleBuildDownloadJob: function(e, t, r) {
UnityLoader.Progress.update(e, t),
UnityLoader.Job.schedule(e, t, [], UnityLoader.downloadJob, {
url: e.resolveBuildUrl(r),
onprogress: function(r) {
UnityLoader.Progress.update(e, t, r)
},
onload: function(r) {
UnityLoader.Progress.update(e, t, r)
}
})
},
loadModule: function(e) {
if (e.useWasm = e.wasmCodeUrl && UnityLoader.SystemInfo.hasWasm,
e.useWasm)
UnityLoader.scheduleBuildDownloadJob(e, "downloadWasmCode", e.wasmCodeUrl),
UnityLoader.Job.schedule(e, "processWasmCode", ["downloadWasmCode"], UnityLoader.processWasmCodeJob),
UnityLoader.scheduleBuildDownloadJob(e, "downloadWasmFramework", e.wasmFrameworkUrl),
UnityLoader.Job.schedule(e, "processWasmFramework", ["downloadWasmFramework", "processWasmCode", "setupIndexedDB"], UnityLoader.processWasmFrameworkJob);
else {
if (!e.asmCodeUrl)
throw "WebAssembly support is not detected in this browser.";
UnityLoader.scheduleBuildDownloadJob(e, "downloadAsmCode", e.asmCodeUrl),
UnityLoader.Job.schedule(e, "processAsmCode", ["downloadAsmCode"], UnityLoader.processAsmCodeJob),
UnityLoader.scheduleBuildDownloadJob(e, "downloadAsmMemory", e.asmMemoryUrl),
UnityLoader.Job.schedule(e, "processAsmMemory", ["downloadAsmMemory"], UnityLoader.processAsmMemoryJob),
e.memoryInitializerRequest = {
addEventListener: function(t, r) {
e.memoryInitializerRequest.callback = r
}
},
e.asmLibraryUrl && (e.dynamicLibraries = [e.asmLibraryUrl].map(e.resolveBuildUrl)),
UnityLoader.scheduleBuildDownloadJob(e, "downloadAsmFramework", e.asmFrameworkUrl),
UnityLoader.Job.schedule(e, "processAsmFramework", ["downloadAsmFramework", "processAsmCode", "setupIndexedDB"], UnityLoader.processAsmFrameworkJob)
}
UnityLoader.scheduleBuildDownloadJob(e, "downloadData", e.dataUrl),
UnityLoader.Job.schedule(e, "setupIndexedDB", [], UnityLoader.setupIndexedDBJob),
e.preRun.push(function() {
e.addRunDependency("processDataJob"),
UnityLoader.Job.schedule(e, "processData", ["downloadData"], UnityLoader.processDataJob)
})
},
instantiate: function(e, t, r) {
function n(e, r) {
if ("string" == typeof e && !(e = document.getElementById(e)))
return !1;
e.innerHTML = "",
e.style.border = e.style.margin = e.style.padding = 0,
"static" == getComputedStyle(e).getPropertyValue("position") && (e.style.position = "relative"),
e.style.width = r.width || e.style.width,
e.style.height = r.height || e.style.height,
r.container = e;
var n = r.Module;
return n.canvas = document.createElement("canvas"),
n.canvas.style.width = "100%",
n.canvas.style.height = "100%",
n.canvas.addEventListener("contextmenu", function(e) {
e.preventDefault()
}),
n.canvas.id = "#canvas",
e.appendChild(n.canvas),
UnityLoader.compatibilityCheck(r, function() {
var t = new XMLHttpRequest;
t.open("GET", r.url, !0),
t.responseType = "text",
t.onload = function() {
var r = JSON.parse(t.responseText);
for (var o in r)
"undefined" == typeof n[o] && (n[o] = r[o]);
e.style.background = n.backgroundUrl ? "center/cover url('" + n.resolveBuildUrl(n.backgroundUrl) + "')" : n.backgroundColor ? " " + n.backgroundColor : "",
UnityLoader.loadModule(n)
}
,
t.send()
}, function() {
console.log("Instantiation of the '" + t + "' terminated due to the failed compatibility check.")
}),
!0
}
var o = {
url: t,
onProgress: UnityLoader.Progress.handler,
Module: {
preRun: [],
postRun: [],
print: function(e) {
console.log(e)
},
printErr: function(e) {
console.error(e)
},
Jobs: {},
buildDownloadProgress: {},
resolveBuildUrl: function(e) {
return e.match(/(http|https|ftp|file):\/\//) ? e : t.substring(0, t.lastIndexOf("/") + 1) + e
}
},
SetFullscreen: function() {
if (o.Module.SetFullscreen)
return o.Module.SetFullscreen.apply(o.Module, arguments)
},
SendMessage: function() {
if (o.Module.SendMessage)
return o.Module.SendMessage.apply(o.Module, arguments)
}
};
o.Module.gameInstance = o,
o.popup = function(e, t) {
return UnityLoader.Error.popup(o, e, t)
}
;
for (var a in r)
if ("Module" == a)
for (var i in r[a])
o.Module[i] = r[a][i];
else
o[a] = r[a];
return n(e, o) || document.addEventListener("DOMContentLoaded", function() {
n(e, o)
}),
o
},
SystemInfo: function() {
var e, t, r, n = "-", o = navigator.appVersion, a = navigator.userAgent, i = navigator.appName, s = "" + parseFloat(navigator.appVersion), d = parseInt(navigator.appVersion, 10);
(t = a.indexOf("Opera")) != -1 ? (i = "Opera",
s = a.substring(t + 6),
(t = a.indexOf("Version")) != -1 && (s = a.substring(t + 8))) : (t = a.indexOf("MSIE")) != -1 ? (i = "Microsoft Internet Explorer",
s = a.substring(t + 5)) : (t = a.indexOf("Chrome")) != -1 ? (i = "Chrome",
s = a.substring(t + 7)) : (t = a.indexOf("Safari")) != -1 ? (i = "Safari",
s = a.substring(t + 7),
(t = a.indexOf("Version")) != -1 && (s = a.substring(t + 8))) : (t = a.indexOf("Firefox")) != -1 ? (i = "Firefox",
s = a.substring(t + 8)) : a.indexOf("Trident/") != -1 ? (i = "Microsoft Internet Explorer",
s = a.substring(a.indexOf("rv:") + 3)) : (e = a.lastIndexOf(" ") + 1) < (t = a.lastIndexOf("/")) && (i = a.substring(e, t),
s = a.substring(t + 1),
i.toLowerCase() == i.toUpperCase() && (i = navigator.appName)),
(r = s.indexOf(";")) != -1 && (s = s.substring(0, r)),
(r = s.indexOf(" ")) != -1 && (s = s.substring(0, r)),
(r = s.indexOf(")")) != -1 && (s = s.substring(0, r)),
d = parseInt("" + s, 10),
isNaN(d) && (s = "" + parseFloat(navigator.appVersion),
d = parseInt(navigator.appVersion, 10));
var l = /Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(o)
, f = n
, u = [{
s: "Windows 3.11",
r: /Win16/
}, {
s: "Windows 95",
r: /(Windows 95|Win95|Windows_95)/
}, {
s: "Windows ME",
r: /(Win 9x 4.90|Windows ME)/
}, {
s: "Windows 98",
r: /(Windows 98|Win98)/
}, {
s: "Windows CE",
r: /Windows CE/
}, {
s: "Windows 2000",
r: /(Windows NT 5.0|Windows 2000)/
}, {
s: "Windows XP",
r: /(Windows NT 5.1|Windows XP)/
}, {
s: "Windows Server 2003",
r: /Windows NT 5.2/
}, {
s: "Windows Vista",
r: /Windows NT 6.0/
}, {
s: "Windows 7",
r: /(Windows 7|Windows NT 6.1)/
}, {
s: "Windows 8.1",
r: /(Windows 8.1|Windows NT 6.3)/
}, {
s: "Windows 8",
r: /(Windows 8|Windows NT 6.2)/
}, {
s: "Windows 10",
r: /(Windows 10|Windows NT 10.0)/
}, {
s: "Windows NT 4.0",
r: /(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/
}, {
s: "Windows ME",
r: /Windows ME/
}, {
s: "Android",
r: /Android/
}, {
s: "Open BSD",
r: /OpenBSD/
}, {
s: "Sun OS",
r: /SunOS/
}, {
s: "Linux",
r: /(Linux|X11)/
}, {
s: "iOS",
r: /(iPhone|iPad|iPod)/
}, {
s: "Mac OS X",
r: /Mac OS X/
}, {
s: "Mac OS",
r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/
}, {
s: "QNX",
r: /QNX/
}, {
s: "UNIX",
r: /UNIX/
}, {
s: "BeOS",
r: /BeOS/
}, {
s: "OS/2",
r: /OS\/2/
}, {
s: "Search Bot",
r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/
}];
for (var c in u) {
var h = u[c];
if (h.r.test(a)) {
f = h.s;
break
}
}
var w = n;
switch (/Windows/.test(f) && (w = /Windows (.*)/.exec(f)[1],
f = "Windows"),
f) {
case "Mac OS X":
w = /Mac OS X (10[\.\_\d]+)/.exec(a)[1];
break;
case "Android":
w = /Android ([\.\_\d]+)/.exec(a)[1];
break;
case "iOS":
w = /OS (\d+)_(\d+)_?(\d+)?/.exec(o),
w = w[1] + "." + w[2] + "." + (0 | w[3])
}
return {
width: screen.width ? screen.width : 0,
height: screen.height ? screen.height : 0,
browser: i,
browserVersion: s,
mobile: l,
os: f,
osVersion: w,
language: window.navigator.userLanguage || window.navigator.language,
hasWebGL: function() {
if (!window.WebGLRenderingContext)
return 0;
var e = document.createElement("canvas")
, t = e.getContext("webgl2");
if (!t) {
var t = e.getContext("experimental-webgl2");
if (!t) {
var t = e.getContext("webgl");
return t || (t = e.getContext("experimental-webgl")) ? 1 : 0
}
return 2
}
return 2
}(),
hasCursorLock: function() {
var e = document.createElement("canvas");
return e.requestPointerLock || e.mozRequestPointerLock || e.webkitRequestPointerLock || e.msRequestPointerLock ? 1 : 0
}(),
hasFullscreen: function() {
var e = document.createElement("canvas");
return (e.requestFullScreen || e.mozRequestFullScreen || e.msRequestFullscreen || e.webkitRequestFullScreen) && i.indexOf("Safari") == -1 ? 1 : 0
}(),
hasWasm: "object" == typeof WebAssembly && "function" == typeof WebAssembly.validate && "function" == typeof WebAssembly.compile
}
}(),
Error: {
init: function() {
return Error.stackTraceLimit = 50,
window.addEventListener("error", function(e) {
var t = UnityLoader.Error.getModule(e);
if (!t)
return UnityLoader.Error.handler(e);
var r = t.useWasm ? t.wasmSymbolsUrl : t.asmSymbolsUrl;
if (!r)
return UnityLoader.Error.handler(e, t);
var n = new XMLHttpRequest;
n.open("GET", t.resolveBuildUrl(r)),
n.responseType = "arraybuffer",
n.onload = function() {
UnityLoader.loadCode(UnityLoader.Compression.decompress(new Uint8Array(n.response)), function(r) {
t.demangleSymbol = UnityLoader[r](),
UnityLoader.Error.handler(e, t)
})
}
,
n.send()
}),
!0
}(),
stackTraceFormat: navigator.userAgent.indexOf("Chrome") != -1 ? "(\\s+at\\s+)(([\\w\\d_\\.]*?)([\\w\\d_$]+)(/[\\w\\d_\\./]+|))(\\s+\\[.*\\]|)\\s*\\((blob:.*)\\)" : "(\\s*)(([\\w\\d_\\.]*?)([\\w\\d_$]+)(/[\\w\\d_\\./]+|))(\\s+\\[.*\\]|)\\s*@(blob:.*)",
stackTraceFormatWasm: navigator.userAgent.indexOf("Chrome") != -1 ? "((\\s+at\\s*)\\s\\(<WASM>\\[(\\d+)\\]\\+\\d+\\))()" : "((\\s*)wasm-function\\[(\\d+)\\])@(blob:.*)",
blobParseRegExp: new RegExp("^(blob:.*)(:\\d+:\\d+)$"),
getModule: function(e) {
var t = e.message.match(new RegExp(this.stackTraceFormat,"g"));
for (var r in t) {
var n = t[r].match(new RegExp("^" + this.stackTraceFormat + "$"))
, o = n[7].match(this.blobParseRegExp);
if (o && UnityLoader.Blobs[o[1]] && UnityLoader.Blobs[o[1]].Module)
return UnityLoader.Blobs[o[1]].Module
}
},
demangle: function(e, t) {
var r = e.message;
return t ? (r = r.replace(new RegExp(this.stackTraceFormat,"g"), function(e) {
var r = e.match(new RegExp("^" + this.stackTraceFormat + "$"))
, n = r[7].match(this.blobParseRegExp)
, o = t.demangleSymbol ? t.demangleSymbol(r[4]) : r[4]
, a = n && UnityLoader.Blobs[n[1]] && UnityLoader.Blobs[n[1]].url ? UnityLoader.Blobs[n[1]].url : "blob";
return r[1] + o + (r[2] != o ? " [" + r[2] + "]" : "") + " (" + (n ? a.substr(a.lastIndexOf("/") + 1) + n[2] : r[7]) + ")"
}
.bind(this)),
t.useWasm && (r = r.replace(new RegExp(this.stackTraceFormatWasm,"g"), function(e) {
var r = e.match(new RegExp("^" + this.stackTraceFormatWasm + "$"))
, n = t.demangleSymbol ? t.demangleSymbol(r[3]) : r[3]
, o = r[4].match(this.blobParseRegExp)
, a = o && UnityLoader.Blobs[o[1]] && UnityLoader.Blobs[o[1]].url ? UnityLoader.Blobs[o[1]].url : "blob";
return (n == r[3] ? r[1] : r[2] + n + " [wasm:" + r[3] + "]") + (r[4] ? " (" + (o ? a.substr(a.lastIndexOf("/") + 1) + o[2] : r[4]) + ")" : "")
}
.bind(this))),
r) : r
},
handler: function(e, t) {
var r = t ? this.demangle(e, t) : e.message;
if (!(t && t.errorhandler && t.errorhandler(r, e.filename, e.lineno) || (console.log("Invoking error handler due to\n" + r),
"function" == typeof dump && dump("Invoking error handler due to\n" + r),
r.indexOf("UnknownError") != -1 || r.indexOf("Program terminated with exit(0)") != -1 || this.didShowErrorMessage))) {
var r = "An error occured running the Unity content on this page. See your browser JavaScript console for more info. The error was:\n" + r;
r.indexOf("DISABLE_EXCEPTION_CATCHING") != -1 ? r = "An exception has occured, but exception handling has been disabled in this build. If you are the developer of this content, enable exceptions in your project WebGL player settings to be able to catch the exception or see the stack trace." : r.indexOf("Cannot enlarge memory arrays") != -1 ? r = "Out of memory. If you are the developer of this content, try allocating more memory to your WebGL build in the WebGL player settings." : r.indexOf("Invalid array buffer length") == -1 && r.indexOf("Invalid typed array length") == -1 && r.indexOf("out of memory") == -1 || (r = "The browser could not allocate enough memory for the WebGL content. If you are the developer of this content, try allocating less memory to your WebGL build in the WebGL player settings."),
alert(r),
this.didShowErrorMessage = !0
}
},
popup: function(e, t, r) {
r = r || [{
text: "OK"
}];
var n = document.createElement("div");
n.style.cssText = "position: absolute; top: 50%; left: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); text-align: center; border: 1px solid black; padding: 5px; background: #E8E8E8";
var o = document.createElement("span");
o.textContent = t,
n.appendChild(o),
n.appendChild(document.createElement("br"));
for (var a = 0; a < r.length; a++) {
var i = document.createElement("button");
r[a].text && (i.textContent = r[a].text),
r[a].callback && (i.onclick = r[a].callback),
i.style.margin = "5px",
i.addEventListener("click", function() {
e.container.removeChild(n)
}),
n.appendChild(i)
}
e.container.appendChild(n)
}
},
Job: {
schedule: function(e, t, r, n, o) {
o = o || {};
var a = e.Jobs[t];
if (a || (a = e.Jobs[t] = {
dependencies: {},
dependants: {}
}),
a.callback)
throw "[UnityLoader.Job.schedule] job '" + t + "' has been already scheduled";
if ("function" != typeof n)
throw "[UnityLoader.Job.schedule] job '" + t + "' has invalid callback";
if ("object" != typeof o)
throw "[UnityLoader.Job.schedule] job '" + t + "' has invalid parameters";
a.callback = function(e, t) {
a.starttime = performance.now(),
n(e, t)
}
,
a.parameters = o,
a.complete = function(r) {
a.endtime = performance.now(),
a.result = {
value: r
};
for (var n in a.dependants) {
var o = e.Jobs[n];
o.dependencies[t] = a.dependants[n] = !1;
var i = "function" != typeof o.callback;
for (var s in o.dependencies)
i = i || o.dependencies[s];
if (!i) {
if (o.executed)
throw "[UnityLoader.Job.schedule] job '" + t + "' has already been executed";
o.executed = !0,
setTimeout(o.callback.bind(null, e, o), 0)
}
}
}
;
var i = !1;
r.forEach(function(r) {
var n = e.Jobs[r];
n || (n = e.Jobs[r] = {
dependencies: {},
dependants: {}
}),
(a.dependencies[r] = n.dependants[t] = !n.result) && (i = !0)
}),
i || (a.executed = !0,
setTimeout(a.callback.bind(null, e, a), 0))
},
result: function(e, t) {
var r = e.Jobs[t];
if (!r)
throw "[UnityLoader.Job.result] job '" + t + "' does not exist";
if ("object" != typeof r.result)
throw "[UnityLoader.Job.result] job '" + t + "' has invalid result";
return r.result.value
}
},
Utils: {
assert: function(e, t) {
e || abort("Assertion failed: " + t)
},
optimizeMathFround: function(e, t) {
console.log("optimizing out Math.fround calls");
for (var r = {
LOOKING_FOR_MODULE: 0,
SCANNING_MODULE_VARIABLES: 1,
SCANNING_MODULE_FUNCTIONS: 2
}, n = ["EMSCRIPTEN_START_ASM", "EMSCRIPTEN_START_FUNCS", "EMSCRIPTEN_END_FUNCS"], o = "var", a = "global.Math.fround;", i = 0, s = t ? r.LOOKING_FOR_MODULE : r.SCANNING_MODULE_VARIABLES, d = 0, l = 0; s <= r.SCANNING_MODULE_FUNCTIONS && i < e.length; i++)
if (47 == e[i] && 47 == e[i + 1] && 32 == e[i + 2] && String.fromCharCode.apply(null, e.subarray(i + 3, i + 3 + n[s].length)) === n[s])
s++;
else if (s != r.SCANNING_MODULE_VARIABLES || l || 61 != e[i] || String.fromCharCode.apply(null, e.subarray(i + 1, i + 1 + a.length)) !== a) {
if (l && 40 == e[i]) {
for (var f = 0; f < l && e[i - 1 - f] == e[d - f]; )
f++;
if (f == l) {
var u = e[i - 1 - f];
if (u < 36 || 36 < u && u < 48 || 57 < u && u < 65 || 90 < u && u < 95 || 95 < u && u < 97 || 122 < u)
for (; f; f--)
e[i - f] = 32
}
}
} else {
for (d = i - 1; 32 != e[d - l]; )
l++;
l && String.fromCharCode.apply(null, e.subarray(d - l - o.length, d - l)) === o || (d = l = 0)
}
return e
}
},
Cryptography: {
crc32: function(e) {
var t = UnityLoader.Cryptography.crc32.module;
if (!t) {
var r = new ArrayBuffer(16777216)
, n = function(e, t, r) {
"use asm";
var n = new e.Uint8Array(r);
var o = new e.Uint32Array(r);
function a(e, t) {
e = e | 0;
t = t | 0;
var r = 0;
for (r = o[1024 >> 2] | 0; t; e = e + 1 | 0,
t = t - 1 | 0)
r = o[(r & 255 ^ n[e]) << 2 >> 2] ^ r >>> 8 ^ 4278190080;
o[1024 >> 2] = r
}
return {
process: a
}
}({
Uint8Array: Uint8Array,
Uint32Array: Uint32Array
}, null, r);
t = UnityLoader.Cryptography.crc32.module = {
buffer: r,
HEAPU8: new Uint8Array(r),
HEAPU32: new Uint32Array(r),
process: n.process,
crc32: 1024,
data: 1028
};
for (var o = 0; o < 256; o++) {
for (var a = 255 ^ o, i = 0; i < 8; i++)
a = a >>> 1 ^ (1 & a ? 3988292384 : 0);
t.HEAPU32[o] = a
}
}
t.HEAPU32[t.crc32 >> 2] = 0;
for (var s = 0; s < e.length; ) {
var d = Math.min(t.HEAPU8.length - t.data, e.length - s);
t.HEAPU8.set(e.subarray(s, s + d), t.data),
crc = t.process(t.data, d),
s += d
}
var l = t.HEAPU32[t.crc32 >> 2];
return new Uint8Array([l >> 24, l >> 16, l >> 8, l])
},
md5: function(e) {
var t = UnityLoader.Cryptography.md5.module;
if (!t) {
var r = new ArrayBuffer(16777216)
, n = function(e, t, r) {
"use asm";
var n = new e.Uint32Array(r);
function o(e, t) {
e = e | 0;
t = t | 0;
var r = 0
, o = 0
, a = 0
, i = 0
, s = 0
, d = 0
, l = 0
, f = 0
, u = 0
, c = 0
, h = 0
, w = 0;
r = n[128] | 0,
o = n[129] | 0,
a = n[130] | 0,
i = n[131] | 0;
for (; t; e = e + 64 | 0,
t = t - 1 | 0) {
s = r;
d = o;
l = a;
f = i;
for (c = 0; (c | 0) < 512; c = c + 8 | 0) {
w = n[c >> 2] | 0;
r = r + (n[c + 4 >> 2] | 0) + (n[e + (w >>> 14) >> 2] | 0) + ((c | 0) < 128 ? i ^ o & (a ^ i) : (c | 0) < 256 ? a ^ i & (o ^ a) : (c | 0) < 384 ? o ^ a ^ i : a ^ (o | ~i)) | 0;
h = (r << (w & 31) | r >>> 32 - (w & 31)) + o | 0;
r = i;
i = a;
a = o;
o = h
}
r = r + s | 0;
o = o + d | 0;
a = a + l | 0;
i = i + f | 0
}
n[128] = r;
n[129] = o;
n[130] = a;
n[131] = i
}
return {
process: o
}
}({
Uint32Array: Uint32Array
}, null, r);
t = UnityLoader.Cryptography.md5.module = {
buffer: r,
HEAPU8: new Uint8Array(r),
HEAPU32: new Uint32Array(r),
process: n.process,
md5: 512,
data: 576
},
t.HEAPU32.set(new Uint32Array([7, 3614090360, 65548, 3905402710, 131089, 606105819, 196630, 3250441966, 262151, 4118548399, 327692, 1200080426, 393233, 2821735955, 458774, 4249261313, 524295, 1770035416, 589836, 2336552879, 655377, 4294925233, 720918, 2304563134, 786439, 1804603682, 851980, 4254626195, 917521, 2792965006, 983062, 1236535329, 65541, 4129170786, 393225, 3225465664, 720910, 643717713, 20, 3921069994, 327685, 3593408605, 655369, 38016083, 983054, 3634488961, 262164, 3889429448, 589829, 568446438, 917513, 3275163606, 196622, 4107603335, 524308, 1163531501, 851973, 2850285829, 131081, 4243563512, 458766, 1735328473, 786452, 2368359562, 327684, 4294588738, 524299, 2272392833, 720912, 1839030562, 917527, 4259657740, 65540, 2763975236, 262155, 1272893353, 458768, 4139469664, 655383, 3200236656, 851972, 681279174, 11, 3936430074, 196624, 3572445317, 393239, 76029189, 589828, 3654602809, 786443, 3873151461, 983056, 530742520, 131095, 3299628645, 6, 4096336452, 458762, 1126891415, 917519, 2878612391, 327701, 4237533241, 786438, 1700485571, 196618, 2399980690, 655375, 4293915773, 65557, 2240044497, 524294, 1873313359, 983050, 4264355552, 393231, 2734768916, 851989, 1309151649, 262150, 4149444226, 720906, 3174756917, 131087, 718787259, 589845, 3951481745]))
}
t.HEAPU32.set(new Uint32Array([1732584193, 4023233417, 2562383102, 271733878]), t.md5 >> 2);
for (var o = 0; o < e.length; ) {
var a = Math.min(t.HEAPU8.length - t.data, e.length - o) & -64;
if (t.HEAPU8.set(e.subarray(o, o + a), t.data),
o += a,
t.process(t.data, a >> 6),
e.length - o < 64) {
if (a = e.length - o,
t.HEAPU8.set(e.subarray(e.length - a, e.length), t.data),
o += a,
t.HEAPU8[t.data + a++] = 128,
a > 56) {
for (var i = a; i < 64; i++)
t.HEAPU8[t.data + i] = 0;
t.process(t.data, 1),
a = 0
}
for (var i = a; i < 64; i++)
t.HEAPU8[t.data + i] = 0;
for (var s = e.length, d = 0, i = 56; i < 64; i++,
d = (224 & s) >> 5,
s /= 256)
t.HEAPU8[t.data + i] = ((31 & s) << 3) + d;
t.process(t.data, 1)
}
}
return new Uint8Array(t.HEAPU8.subarray(t.md5, t.md5 + 16))
},
sha1: function(e) {
var t = UnityLoader.Cryptography.sha1.module;
if (!t) {
var r = new ArrayBuffer(16777216)
, n = function(e, t, r) {
"use asm";
var n = new e.Uint32Array(r);
function o(e, t) {
e = e | 0;
t = t | 0;
var r = 0
, o = 0
, a = 0
, i = 0
, s = 0
, d = 0
, l = 0
, f = 0
, u = 0
, c = 0
, h = 0
, w = 0;
r = n[80] | 0,
o = n[81] | 0,
a = n[82] | 0,
i = n[83] | 0,
s = n[84] | 0;
for (; t; e = e + 64 | 0,
t = t - 1 | 0) {
d = r;
l = o;
f = a;
u = i;
c = s;
for (w = 0; (w | 0) < 320; w = w + 4 | 0,
s = i,
i = a,
a = o << 30 | o >>> 2,
o = r,
r = h) {
if ((w | 0) < 64) {
h = n[e + w >> 2] | 0;
h = h << 24 & 4278190080 | h << 8 & 16711680 | h >>> 8 & 65280 | h >>> 24 & 255
} else {
h = n[w - 12 >> 2] ^ n[w - 32 >> 2] ^ n[w - 56 >> 2] ^ n[w - 64 >> 2];
h = h << 1 | h >>> 31
}
n[w >> 2] = h;
h = h + ((r << 5 | r >>> 27) + s) + ((w | 0) < 80 ? (o & a | ~o & i | 0) + 1518500249 | 0 : (w | 0) < 160 ? (o ^ a ^ i) + 1859775393 | 0 : (w | 0) < 240 ? (o & a | o & i | a & i) + 2400959708 | 0 : (o ^ a ^ i) + 3395469782 | 0) | 0
}
r = r + d | 0;
o = o + l | 0;
a = a + f | 0;
i = i + u | 0;
s = s + c | 0
}
n[80] = r;
n[81] = o;
n[82] = a;
n[83] = i;
n[84] = s
}
return {
process: o
}
}({
Uint32Array: Uint32Array
}, null, r);
t = UnityLoader.Cryptography.sha1.module = {
buffer: r,
HEAPU8: new Uint8Array(r),
HEAPU32: new Uint32Array(r),
process: n.process,
sha1: 320,
data: 384
}
}
t.HEAPU32.set(new Uint32Array([1732584193, 4023233417, 2562383102, 271733878, 3285377520]), t.sha1 >> 2);
for (var o = 0; o < e.length; ) {
var a = Math.min(t.HEAPU8.length - t.data, e.length - o) & -64;
if (t.HEAPU8.set(e.subarray(o, o + a), t.data),
o += a,
t.process(t.data, a >> 6),
e.length - o < 64) {
if (a = e.length - o,
t.HEAPU8.set(e.subarray(e.length - a, e.length), t.data),
o += a,
t.HEAPU8[t.data + a++] = 128,
a > 56) {
for (var i = a; i < 64; i++)
t.HEAPU8[t.data + i] = 0;
t.process(t.data, 1),
a = 0
}
for (var i = a; i < 64; i++)
t.HEAPU8[t.data + i] = 0;
for (var s = e.length, d = 0, i = 63; i >= 56; i--,
d = (224 & s) >> 5,
s /= 256)
t.HEAPU8[t.data + i] = ((31 & s) << 3) + d;
t.process(t.data, 1)
}
}
for (var l = new Uint8Array(20), i = 0; i < l.length; i++)
l[i] = t.HEAPU8[t.sha1 + (i & -4) + 3 - (3 & i)];
return l
}
},
Progress: {
Styles: {
Dark: {
progressLogoUrl: "data:image/png;base64,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",
progressEmptyUrl: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAAASCAYAAABmbl0zAAAACXBIWXMAAAsSAAALEgHS3X78AAAATUlEQVRo3u3aIQ4AIAwEQUr4/5cPiyMVBDOj0M2mCKgkGdAwjYCudZzLOLiITYPrCdEgGkSDaEA0iAbRIBpEA6JBNHx1vnL7V4NNwxsbCNMGI3YImu0AAAAASUVORK5CYII=",
progressFullUrl: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAAASCAYAAABmbl0zAAAACXBIWXMAAAsSAAALEgHS3X78AAAAO0lEQVRo3u3SQREAAAjDMMC/56EB3omEXjtJCg5GAkyDaTANpsE0YBpMg2kwDaYB02AaTINpMA2Yhr8FO18EIBpZMeQAAAAASUVORK5CYII="
},
Light: {
progressLogoUrl: "data:image/png;base64,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",
progressEmptyUrl: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAAASCAYAAABmbl0zAAAACXBIWXMAAAsSAAALEgHS3X78AAAAUUlEQVRo3u3aMQ4AEAxAUcRJzGb3v1mt3cQglvcmc/NTA3XMFQUuNCPgVk/nahwchE2D6wnRIBpEg2hANIgG0SAaRAOiQTR8lV+5/avBpuGNDcz6A6oq1CgNAAAAAElFTkSuQmCC",
progressFullUrl: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAAASCAYAAABmbl0zAAAACXBIWXMAAAsSAAALEgHS3X78AAAAQElEQVRo3u3SMREAMAgAsVIpnTvj3xlogDmR8PfxftaBgSsBpsE0mAbTYBowDabBNJgG04BpMA2mwTSYBkzDXgP/hgGnr4PpeAAAAABJRU5ErkJggg=="
}
},
handler: function(e, t) {
if (e.Module) {
var r = UnityLoader.Progress.Styles[e.Module.splashScreenStyle]
, n = e.Module.progressLogoUrl ? e.Module.resolveBuildUrl(e.Module.progressLogoUrl) : r.progressLogoUrl
, o = e.Module.progressEmptyUrl ? e.Module.resolveBuildUrl(e.Module.progressEmptyUrl) : r.progressEmptyUrl
, a = e.Module.progressFullUrl ? e.Module.resolveBuildUrl(e.Module.progressFullUrl) : r.progressFullUrl
, i = "position: absolute; left: 50%; top: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%);";
e.logo || (e.logo = document.createElement("div"),
e.logo.style.cssText = i + "background: url('" + n + "') no-repeat center / contain; width: 154px; height: 130px;",
e.container.appendChild(e.logo)),
e.progress || (e.progress = document.createElement("div"),
e.progress.style.cssText = i + " height: 18px; width: 141px; margin-top: 90px;",
e.progress.empty = document.createElement("div"),
e.progress.empty.style.cssText = "background: url('" + o + "') no-repeat right / cover; float: right; width: 100%; height: 100%; display: inline-block;",
e.progress.appendChild(e.progress.empty),
e.progress.full = document.createElement("div"),
e.progress.full.style.cssText = "background: url('" + a + "') no-repeat left / cover; float: left; width: 0%; height: 100%; display: inline-block;",
e.progress.appendChild(e.progress.full),
e.container.appendChild(e.progress)),
e.progress.full.style.width = 100 * t + "%",
e.progress.empty.style.width = 100 * (1 - t) + "%",
1 == t && (e.logo.style.display = e.progress.style.display = "none")
}
},
update: function(e, t, r) {
var n = e.buildDownloadProgress[t];
n || (n = e.buildDownloadProgress[t] = {
started: !1,
finished: !1,
lengthComputable: !1,
total: 0,
loaded: 0
}),
"object" != typeof r || "progress" != r.type && "load" != r.type || (n.started || (n.started = !0,
n.lengthComputable = r.lengthComputable,
n.total = r.total),
n.loaded = r.loaded,
"load" == r.type && (n.finished = !0));
var o = 0
, a = 0
, i = 0
, s = 0
, d = 0;
for (var t in e.buildDownloadProgress) {
var n = e.buildDownloadProgress[t];
if (!n.started)
return 0;
i++,
n.lengthComputable ? (o += n.loaded,
a += n.total,
s++) : n.finished || d++
}
var l = i ? (i - d - (a ? s * (a - o) / a : 0)) / i : 0;
e.gameInstance.onProgress(e.gameInstance, l)
}
},
Compression: {
identity: {
require: function() {
return {}
},
decompress: function(e) {
return e
}
},
gzip: {
require: function(e) {
var t = {
"inflate.js": function(e, t, r) {
"use strict";
function n(e) {
if (!(this instanceof n))
return new n(e);
this.options = s.assign({
chunkSize: 16384,
windowBits: 0,
to: ""
}, e || {});
var t = this.options;
t.raw && t.windowBits >= 0 && t.windowBits < 16 && (t.windowBits = -t.windowBits,
0 === t.windowBits && (t.windowBits = -15)),
!(t.windowBits >= 0 && t.windowBits < 16) || e && e.windowBits || (t.windowBits += 32),
t.windowBits > 15 && t.windowBits < 48 && 0 === (15 & t.windowBits) && (t.windowBits |= 15),
this.err = 0,
this.msg = "",
this.ended = !1,
this.chunks = [],
this.strm = new u,
this.strm.avail_out = 0;
var r = i.inflateInit2(this.strm, t.windowBits);
if (r !== l.Z_OK)
throw new Error(f[r]);
this.header = new c,
i.inflateGetHeader(this.strm, this.header)
}
function o(e, t) {
var r = new n(t);
if (r.push(e, !0),
r.err)
throw r.msg || f[r.err];
return r.result
}
function a(e, t) {
return t = t || {},
t.raw = !0,
o(e, t)
}
var i = e("./zlib/inflate")
, s = e("./utils/common")
, d = e("./utils/strings")
, l = e("./zlib/constants")
, f = e("./zlib/messages")
, u = e("./zlib/zstream")
, c = e("./zlib/gzheader")
, h = Object.prototype.toString;
n.prototype.push = function(e, t) {
var r, n, o, a, f, u, c = this.strm, w = this.options.chunkSize, p = this.options.dictionary, m = !1;
if (this.ended)
return !1;
n = t === ~~t ? t : t === !0 ? l.Z_FINISH : l.Z_NO_FLUSH,
"string" == typeof e ? c.input = d.binstring2buf(e) : "[object ArrayBuffer]" === h.call(e) ? c.input = new Uint8Array(e) : c.input = e,
c.next_in = 0,
c.avail_in = c.input.length;
do {
if (0 === c.avail_out && (c.output = new s.Buf8(w),
c.next_out = 0,
c.avail_out = w),
r = i.inflate(c, l.Z_NO_FLUSH),
r === l.Z_NEED_DICT && p && (u = "string" == typeof p ? d.string2buf(p) : "[object ArrayBuffer]" === h.call(p) ? new Uint8Array(p) : p,
r = i.inflateSetDictionary(this.strm, u)),
r === l.Z_BUF_ERROR && m === !0 && (r = l.Z_OK,
m = !1),
r !== l.Z_STREAM_END && r !== l.Z_OK)
return this.onEnd(r),
this.ended = !0,
!1;
c.next_out && (0 !== c.avail_out && r !== l.Z_STREAM_END && (0 !== c.avail_in || n !== l.Z_FINISH && n !== l.Z_SYNC_FLUSH) || ("string" === this.options.to ? (o = d.utf8border(c.output, c.next_out),
a = c.next_out - o,
f = d.buf2string(c.output, o),
c.next_out = a,
c.avail_out = w - a,
a && s.arraySet(c.output, c.output, o, a, 0),
this.onData(f)) : this.onData(s.shrinkBuf(c.output, c.next_out)))),
0 === c.avail_in && 0 === c.avail_out && (m = !0)
} while ((c.avail_in > 0 || 0 === c.avail_out) && r !== l.Z_STREAM_END);return r === l.Z_STREAM_END && (n = l.Z_FINISH),
n === l.Z_FINISH ? (r = i.inflateEnd(this.strm),
this.onEnd(r),
this.ended = !0,
r === l.Z_OK) : n !== l.Z_SYNC_FLUSH || (this.onEnd(l.Z_OK),
c.avail_out = 0,
!0)
}
,
n.prototype.onData = function(e) {
this.chunks.push(e)
}
,
n.prototype.onEnd = function(e) {
e === l.Z_OK && ("string" === this.options.to ? this.result = this.chunks.join("") : this.result = s.flattenChunks(this.chunks)),
this.chunks = [],
this.err = e,
this.msg = this.strm.msg
}
,
r.Inflate = n,
r.inflate = o,
r.inflateRaw = a,
r.ungzip = o
},
"utils/common.js": function(e, t, r) {
"use strict";
var n = "undefined" != typeof Uint8Array && "undefined" != typeof Uint16Array && "undefined" != typeof Int32Array;
r.assign = function(e) {
for (var t = Array.prototype.slice.call(arguments, 1); t.length; ) {
var r = t.shift();
if (r) {
if ("object" != typeof r)
throw new TypeError(r + "must be non-object");
for (var n in r)
r.hasOwnProperty(n) && (e[n] = r[n])
}
}
return e
}
,
r.shrinkBuf = function(e, t) {
return e.length === t ? e : e.subarray ? e.subarray(0, t) : (e.length = t,
e)
}
;
var o = {
arraySet: function(e, t, r, n, o) {
if (t.subarray && e.subarray)
return void e.set(t.subarray(r, r + n), o);
for (var a = 0; a < n; a++)
e[o + a] = t[r + a]
},
flattenChunks: function(e) {
var t, r, n, o, a, i;
for (n = 0,
t = 0,
r = e.length; t < r; t++)
n += e[t].length;
for (i = new Uint8Array(n),
o = 0,
t = 0,
r = e.length; t < r; t++)
a = e[t],
i.set(a, o),
o += a.length;
return i
}
}
, a = {
arraySet: function(e, t, r, n, o) {
for (var a = 0; a < n; a++)
e[o + a] = t[r + a]
},
flattenChunks: function(e) {
return [].concat.apply([], e)
}
};
r.setTyped = function(e) {
e ? (r.Buf8 = Uint8Array,
r.Buf16 = Uint16Array,
r.Buf32 = Int32Array,
r.assign(r, o)) : (r.Buf8 = Array,
r.Buf16 = Array,
r.Buf32 = Array,
r.assign(r, a))
}
,
r.setTyped(n)
},
"utils/strings.js": function(e, t, r) {
"use strict";
function n(e, t) {
if (t < 65537 && (e.subarray && i || !e.subarray && a))
return String.fromCharCode.apply(null, o.shrinkBuf(e, t));
for (var r = "", n = 0; n < t; n++)
r += String.fromCharCode(e[n]);
return r
}
var o = e("./common")
, a = !0
, i = !0;
try {
String.fromCharCode.apply(null, [0])
} catch (e) {
a = !1
}
try {
String.fromCharCode.apply(null, new Uint8Array(1))
} catch (e) {
i = !1
}
for (var s = new o.Buf8(256), d = 0; d < 256; d++)
s[d] = d >= 252 ? 6 : d >= 248 ? 5 : d >= 240 ? 4 : d >= 224 ? 3 : d >= 192 ? 2 : 1;
s[254] = s[254] = 1,
r.string2buf = function(e) {
var t, r, n, a, i, s = e.length, d = 0;
for (a = 0; a < s; a++)
r = e.charCodeAt(a),
55296 === (64512 & r) && a + 1 < s && (n = e.charCodeAt(a + 1),
56320 === (64512 & n) && (r = 65536 + (r - 55296 << 10) + (n - 56320),
a++)),
d += r < 128 ? 1 : r < 2048 ? 2 : r < 65536 ? 3 : 4;
for (t = new o.Buf8(d),
i = 0,
a = 0; i < d; a++)
r = e.charCodeAt(a),
55296 === (64512 & r) && a + 1 < s && (n = e.charCodeAt(a + 1),
56320 === (64512 & n) && (r = 65536 + (r - 55296 << 10) + (n - 56320),
a++)),
r < 128 ? t[i++] = r : r < 2048 ? (t[i++] = 192 | r >>> 6,
t[i++] = 128 | 63 & r) : r < 65536 ? (t[i++] = 224 | r >>> 12,
t[i++] = 128 | r >>> 6 & 63,
t[i++] = 128 | 63 & r) : (t[i++] = 240 | r >>> 18,
t[i++] = 128 | r >>> 12 & 63,
t[i++] = 128 | r >>> 6 & 63,
t[i++] = 128 | 63 & r);
return t
}
,
r.buf2binstring = function(e) {
return n(e, e.length)
}
,
r.binstring2buf = function(e) {
for (var t = new o.Buf8(e.length), r = 0, n = t.length; r < n; r++)
t[r] = e.charCodeAt(r);
return t
}
,
r.buf2string = function(e, t) {
var r, o, a, i, d = t || e.length, l = new Array(2 * d);
for (o = 0,
r = 0; r < d; )
if (a = e[r++],
a < 128)
l[o++] = a;
else if (i = s[a],
i > 4)
l[o++] = 65533,
r += i - 1;
else {
for (a &= 2 === i ? 31 : 3 === i ? 15 : 7; i > 1 && r < d; )
a = a << 6 | 63 & e[r++],
i--;
i > 1 ? l[o++] = 65533 : a < 65536 ? l[o++] = a : (a -= 65536,
l[o++] = 55296 | a >> 10 & 1023,
l[o++] = 56320 | 1023 & a)
}
return n(l, o)
}
,
r.utf8border = function(e, t) {
var r;
for (t = t || e.length,
t > e.length && (t = e.length),
r = t - 1; r >= 0 && 128 === (192 & e[r]); )
r--;
return r < 0 ? t : 0 === r ? t : r + s[e[r]] > t ? r : t
}
},
"zlib/inflate.js": function(e, t, r) {
"use strict";
function n(e) {
return (e >>> 24 & 255) + (e >>> 8 & 65280) + ((65280 & e) << 8) + ((255 & e) << 24)
}
function o() {
this.mode = 0,
this.last = !1,
this.wrap = 0,
this.havedict = !1,
this.flags = 0,
this.dmax = 0,
this.check = 0,
this.total = 0,
this.head = null,
this.wbits = 0,
this.wsize = 0,
this.whave = 0,
this.wnext = 0,
this.window = null,
this.hold = 0,
this.bits = 0,
this.length = 0,
this.offset = 0,
this.extra = 0,
this.lencode = null,
this.distcode = null,
this.lenbits = 0,
this.distbits = 0,
this.ncode = 0,
this.nlen = 0,
this.ndist = 0,
this.have = 0,
this.next = null,
this.lens = new g.Buf16(320),
this.work = new g.Buf16(288),
this.lendyn = null,
this.distdyn = null,
this.sane = 0,
this.back = 0,
this.was = 0
}
function a(e) {
var t;
return e && e.state ? (t = e.state,
e.total_in = e.total_out = t.total = 0,
e.msg = "",
t.wrap && (e.adler = 1 & t.wrap),
t.mode = I,
t.last = 0,
t.havedict = 0,
t.dmax = 32768,
t.head = null,
t.hold = 0,
t.bits = 0,
t.lencode = t.lendyn = new g.Buf32(pe),
t.distcode = t.distdyn = new g.Buf32(me),
t.sane = 1,
t.back = -1,
O) : R
}
function i(e) {
var t;
return e && e.state ? (t = e.state,
t.wsize = 0,
t.whave = 0,
t.wnext = 0,
a(e)) : R
}
function s(e, t) {
var r, n;
return e && e.state ? (n = e.state,
t < 0 ? (r = 0,
t = -t) : (r = (t >> 4) + 1,
t < 48 && (t &= 15)),
t && (t < 8 || t > 15) ? R : (null !== n.window && n.wbits !== t && (n.window = null),
n.wrap = r,
n.wbits = t,
i(e))) : R
}
function d(e, t) {
var r, n;
return e ? (n = new o,
e.state = n,
n.window = null,
r = s(e, t),
r !== O && (e.state = null),
r) : R
}
function l(e) {
return d(e, ge)
}
function f(e) {
if (ye) {
var t;
for (m = new g.Buf32(512),
b = new g.Buf32(32),
t = 0; t < 144; )
e.lens[t++] = 8;
for (; t < 256; )
e.lens[t++] = 9;
for (; t < 280; )
e.lens[t++] = 7;
for (; t < 288; )
e.lens[t++] = 8;
for (U(k, e.lens, 0, 288, m, 0, e.work, {
bits: 9
}),
t = 0; t < 32; )
e.lens[t++] = 5;
U(E, e.lens, 0, 32, b, 0, e.work, {
bits: 5
}),
ye = !1
}
e.lencode = m,
e.lenbits = 9,
e.distcode = b,
e.distbits = 5
}
function u(e, t, r, n) {
var o, a = e.state;
return null === a.window && (a.wsize = 1 << a.wbits,
a.wnext = 0,
a.whave = 0,
a.window = new g.Buf8(a.wsize)),
n >= a.wsize ? (g.arraySet(a.window, t, r - a.wsize, a.wsize, 0),
a.wnext = 0,
a.whave = a.wsize) : (o = a.wsize - a.wnext,
o > n && (o = n),
g.arraySet(a.window, t, r - n, o, a.wnext),
n -= o,
n ? (g.arraySet(a.window, t, r - n, n, 0),
a.wnext = n,
a.whave = a.wsize) : (a.wnext += o,
a.wnext === a.wsize && (a.wnext = 0),
a.whave < a.wsize && (a.whave += o))),
0
}
function c(e, t) {
var r, o, a, i, s, d, l, c, h, w, p, m, b, pe, me, be, ge, ye, Ae, ve, Ue, xe, ke, Ee, Be = 0, We = new g.Buf8(4), Le = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
if (!e || !e.state || !e.output || !e.input && 0 !== e.avail_in)
return R;
r = e.state,
r.mode === j && (r.mode = X),
s = e.next_out,
a = e.output,
l = e.avail_out,
i = e.next_in,
o = e.input,
d = e.avail_in,
c = r.hold,
h = r.bits,
w = d,
p = l,
xe = O;
e: for (; ; )
switch (r.mode) {
case I:
if (0 === r.wrap) {
r.mode = X;
break
}
for (; h < 16; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
if (2 & r.wrap && 35615 === c) {
r.check = 0,
We[0] = 255 & c,
We[1] = c >>> 8 & 255,
r.check = A(r.check, We, 2, 0),
c = 0,
h = 0,
r.mode = F;
break
}
if (r.flags = 0,
r.head && (r.head.done = !1),
!(1 & r.wrap) || (((255 & c) << 8) + (c >> 8)) % 31) {
e.msg = "incorrect header check",
r.mode = ce;
break
}
if ((15 & c) !== S) {
e.msg = "unknown compression method",
r.mode = ce;
break
}
if (c >>>= 4,
h -= 4,
Ue = (15 & c) + 8,
0 === r.wbits)
r.wbits = Ue;
else if (Ue > r.wbits) {
e.msg = "invalid window size",
r.mode = ce;
break
}
r.dmax = 1 << Ue,
e.adler = r.check = 1,
r.mode = 512 & c ? J : j,
c = 0,
h = 0;
break;
case F:
for (; h < 16; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
if (r.flags = c,
(255 & r.flags) !== S) {
e.msg = "unknown compression method",
r.mode = ce;
break
}
if (57344 & r.flags) {
e.msg = "unknown header flags set",
r.mode = ce;
break
}
r.head && (r.head.text = c >> 8 & 1),
512 & r.flags && (We[0] = 255 & c,
We[1] = c >>> 8 & 255,
r.check = A(r.check, We, 2, 0)),
c = 0,
h = 0,
r.mode = P;
case P:
for (; h < 32; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
r.head && (r.head.time = c),
512 & r.flags && (We[0] = 255 & c,
We[1] = c >>> 8 & 255,
We[2] = c >>> 16 & 255,
We[3] = c >>> 24 & 255,
r.check = A(r.check, We, 4, 0)),
c = 0,
h = 0,
r.mode = V;
case V:
for (; h < 16; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
r.head && (r.head.xflags = 255 & c,
r.head.os = c >> 8),
512 & r.flags && (We[0] = 255 & c,
We[1] = c >>> 8 & 255,
r.check = A(r.check, We, 2, 0)),
c = 0,
h = 0,
r.mode = D;
case D:
if (1024 & r.flags) {
for (; h < 16; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
r.length = c,
r.head && (r.head.extra_len = c),
512 & r.flags && (We[0] = 255 & c,
We[1] = c >>> 8 & 255,
r.check = A(r.check, We, 2, 0)),
c = 0,
h = 0
} else
r.head && (r.head.extra = null);
r.mode = Z;
case Z:
if (1024 & r.flags && (m = r.length,
m > d && (m = d),
m && (r.head && (Ue = r.head.extra_len - r.length,
r.head.extra || (r.head.extra = new Array(r.head.extra_len)),
g.arraySet(r.head.extra, o, i, m, Ue)),
512 & r.flags && (r.check = A(r.check, o, m, i)),
d -= m,
i += m,
r.length -= m),
r.length))
break e;
r.length = 0,
r.mode = q;
case q:
if (2048 & r.flags) {
if (0 === d)
break e;
m = 0;
do
Ue = o[i + m++],
r.head && Ue && r.length < 65536 && (r.head.name += String.fromCharCode(Ue));
while (Ue && m < d);if (512 & r.flags && (r.check = A(r.check, o, m, i)),
d -= m,
i += m,
Ue)
break e
} else
r.head && (r.head.name = null);
r.length = 0,
r.mode = Y;
case Y:
if (4096 & r.flags) {
if (0 === d)
break e;
m = 0;
do
Ue = o[i + m++],
r.head && Ue && r.length < 65536 && (r.head.comment += String.fromCharCode(Ue));
while (Ue && m < d);if (512 & r.flags && (r.check = A(r.check, o, m, i)),
d -= m,
i += m,
Ue)
break e
} else
r.head && (r.head.comment = null);
r.mode = z;
case z:
if (512 & r.flags) {
for (; h < 16; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
if (c !== (65535 & r.check)) {
e.msg = "header crc mismatch",
r.mode = ce;
break
}
c = 0,
h = 0
}
r.head && (r.head.hcrc = r.flags >> 9 & 1,
r.head.done = !0),
e.adler = r.check = 0,
r.mode = j;
break;
case J:
for (; h < 32; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
e.adler = r.check = n(c),
c = 0,
h = 0,
r.mode = G;
case G:
if (0 === r.havedict)
return e.next_out = s,
e.avail_out = l,
e.next_in = i,
e.avail_in = d,
r.hold = c,
r.bits = h,
N;
e.adler = r.check = 1,
r.mode = j;
case j:
if (t === W || t === L)
break e;
case X:
if (r.last) {
c >>>= 7 & h,
h -= 7 & h,
r.mode = le;
break
}
for (; h < 3; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
switch (r.last = 1 & c,
c >>>= 1,
h -= 1,
3 & c) {
case 0:
r.mode = K;
break;
case 1:
if (f(r),
r.mode = re,
t === L) {
c >>>= 2,
h -= 2;
break e
}
break;
case 2:
r.mode = $;
break;
case 3:
e.msg = "invalid block type",
r.mode = ce
}
c >>>= 2,
h -= 2;
break;
case K:
for (c >>>= 7 & h,
h -= 7 & h; h < 32; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
if ((65535 & c) !== (c >>> 16 ^ 65535)) {
e.msg = "invalid stored block lengths",
r.mode = ce;
break
}
if (r.length = 65535 & c,
c = 0,
h = 0,
r.mode = Q,
t === L)
break e;
case Q:
r.mode = _;
case _:
if (m = r.length) {
if (m > d && (m = d),
m > l && (m = l),
0 === m)
break e;
g.arraySet(a, o, i, m, s),
d -= m,
i += m,
l -= m,
s += m,
r.length -= m;
break
}
r.mode = j;
break;
case $:
for (; h < 14; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
if (r.nlen = (31 & c) + 257,
c >>>= 5,
h -= 5,
r.ndist = (31 & c) + 1,
c >>>= 5,
h -= 5,
r.ncode = (15 & c) + 4,
c >>>= 4,
h -= 4,
r.nlen > 286 || r.ndist > 30) {
e.msg = "too many length or distance symbols",
r.mode = ce;
break
}
r.have = 0,
r.mode = ee;
case ee:
for (; r.have < r.ncode; ) {
for (; h < 3; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
r.lens[Le[r.have++]] = 7 & c,
c >>>= 3,
h -= 3
}
for (; r.have < 19; )
r.lens[Le[r.have++]] = 0;
if (r.lencode = r.lendyn,
r.lenbits = 7,
ke = {
bits: r.lenbits
},
xe = U(x, r.lens, 0, 19, r.lencode, 0, r.work, ke),
r.lenbits = ke.bits,
xe) {
e.msg = "invalid code lengths set",
r.mode = ce;
break
}
r.have = 0,
r.mode = te;
case te:
for (; r.have < r.nlen + r.ndist; ) {
for (; Be = r.lencode[c & (1 << r.lenbits) - 1],
me = Be >>> 24,
be = Be >>> 16 & 255,
ge = 65535 & Be,
!(me <= h); ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
if (ge < 16)
c >>>= me,
h -= me,
r.lens[r.have++] = ge;
else {
if (16 === ge) {
for (Ee = me + 2; h < Ee; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
if (c >>>= me,
h -= me,
0 === r.have) {
e.msg = "invalid bit length repeat",
r.mode = ce;
break
}
Ue = r.lens[r.have - 1],
m = 3 + (3 & c),
c >>>= 2,
h -= 2
} else if (17 === ge) {
for (Ee = me + 3; h < Ee; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
c >>>= me,
h -= me,
Ue = 0,
m = 3 + (7 & c),
c >>>= 3,
h -= 3
} else {
for (Ee = me + 7; h < Ee; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
c >>>= me,
h -= me,
Ue = 0,
m = 11 + (127 & c),
c >>>= 7,
h -= 7
}
if (r.have + m > r.nlen + r.ndist) {
e.msg = "invalid bit length repeat",
r.mode = ce;
break
}
for (; m--; )
r.lens[r.have++] = Ue
}
}
if (r.mode === ce)
break;
if (0 === r.lens[256]) {
e.msg = "invalid code -- missing end-of-block",
r.mode = ce;
break
}
if (r.lenbits = 9,
ke = {
bits: r.lenbits
},
xe = U(k, r.lens, 0, r.nlen, r.lencode, 0, r.work, ke),
r.lenbits = ke.bits,
xe) {
e.msg = "invalid literal/lengths set",
r.mode = ce;
break
}
if (r.distbits = 6,
r.distcode = r.distdyn,
ke = {
bits: r.distbits
},
xe = U(E, r.lens, r.nlen, r.ndist, r.distcode, 0, r.work, ke),
r.distbits = ke.bits,
xe) {
e.msg = "invalid distances set",
r.mode = ce;
break
}
if (r.mode = re,
t === L)
break e;
case re:
r.mode = ne;
case ne:
if (d >= 6 && l >= 258) {
e.next_out = s,
e.avail_out = l,
e.next_in = i,
e.avail_in = d,
r.hold = c,
r.bits = h,
v(e, p),
s = e.next_out,
a = e.output,
l = e.avail_out,
i = e.next_in,
o = e.input,
d = e.avail_in,
c = r.hold,
h = r.bits,
r.mode === j && (r.back = -1);
break
}
for (r.back = 0; Be = r.lencode[c & (1 << r.lenbits) - 1],
me = Be >>> 24,
be = Be >>> 16 & 255,
ge = 65535 & Be,
!(me <= h); ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
if (be && 0 === (240 & be)) {
for (ye = me,
Ae = be,
ve = ge; Be = r.lencode[ve + ((c & (1 << ye + Ae) - 1) >> ye)],
me = Be >>> 24,
be = Be >>> 16 & 255,
ge = 65535 & Be,
!(ye + me <= h); ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
c >>>= ye,
h -= ye,
r.back += ye
}
if (c >>>= me,
h -= me,
r.back += me,
r.length = ge,
0 === be) {
r.mode = de;
break
}
if (32 & be) {
r.back = -1,
r.mode = j;
break
}
if (64 & be) {
e.msg = "invalid literal/length code",
r.mode = ce;
break
}
r.extra = 15 & be,
r.mode = oe;
case oe:
if (r.extra) {
for (Ee = r.extra; h < Ee; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
r.length += c & (1 << r.extra) - 1,
c >>>= r.extra,
h -= r.extra,
r.back += r.extra
}
r.was = r.length,
r.mode = ae;
case ae:
for (; Be = r.distcode[c & (1 << r.distbits) - 1],
me = Be >>> 24,
be = Be >>> 16 & 255,
ge = 65535 & Be,
!(me <= h); ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
if (0 === (240 & be)) {
for (ye = me,
Ae = be,
ve = ge; Be = r.distcode[ve + ((c & (1 << ye + Ae) - 1) >> ye)],
me = Be >>> 24,
be = Be >>> 16 & 255,
ge = 65535 & Be,
!(ye + me <= h); ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
c >>>= ye,
h -= ye,
r.back += ye
}
if (c >>>= me,
h -= me,
r.back += me,
64 & be) {
e.msg = "invalid distance code",
r.mode = ce;
break
}
r.offset = ge,
r.extra = 15 & be,
r.mode = ie;
case ie:
if (r.extra) {
for (Ee = r.extra; h < Ee; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
r.offset += c & (1 << r.extra) - 1,
c >>>= r.extra,
h -= r.extra,
r.back += r.extra
}
if (r.offset > r.dmax) {
e.msg = "invalid distance too far back",
r.mode = ce;
break
}
r.mode = se;
case se:
if (0 === l)
break e;
if (m = p - l,
r.offset > m) {
if (m = r.offset - m,
m > r.whave && r.sane) {
e.msg = "invalid distance too far back",
r.mode = ce;
break
}
m > r.wnext ? (m -= r.wnext,
b = r.wsize - m) : b = r.wnext - m,
m > r.length && (m = r.length),
pe = r.window
} else
pe = a,
b = s - r.offset,
m = r.length;
m > l && (m = l),
l -= m,
r.length -= m;
do
a[s++] = pe[b++];
while (--m);0 === r.length && (r.mode = ne);
break;
case de:
if (0 === l)
break e;
a[s++] = r.length,
l--,
r.mode = ne;
break;
case le:
if (r.wrap) {
for (; h < 32; ) {
if (0 === d)
break e;
d--,
c |= o[i++] << h,
h += 8
}
if (p -= l,
e.total_out += p,
r.total += p,
p && (e.adler = r.check = r.flags ? A(r.check, a, p, s - p) : y(r.check, a, p, s - p)),
p = l,
(r.flags ? c : n(c)) !== r.check) {
e.msg = "incorrect data check",
r.mode = ce;
break
}
c = 0,
h = 0
}
r.mode = fe;
case fe:
if (r.wrap && r.flags) {
for (; h < 32; ) {
if (0 === d)
break e;
d--,
c += o[i++] << h,
h += 8
}
if (c !== (4294967295 & r.total)) {
e.msg = "incorrect length check",
r.mode = ce;
break
}
c = 0,
h = 0
}
r.mode = ue;
case ue:
xe = M;
break e;
case ce:
xe = C;
break e;
case he:
return H;
case we:
default:
return R
}
return e.next_out = s,
e.avail_out = l,
e.next_in = i,
e.avail_in = d,
r.hold = c,
r.bits = h,
(r.wsize || p !== e.avail_out && r.mode < ce && (r.mode < le || t !== B)) && u(e, e.output, e.next_out, p - e.avail_out) ? (r.mode = he,
H) : (w -= e.avail_in,
p -= e.avail_out,
e.total_in += w,
e.total_out += p,
r.total += p,
r.wrap && p && (e.adler = r.check = r.flags ? A(r.check, a, p, e.next_out - p) : y(r.check, a, p, e.next_out - p)),
e.data_type = r.bits + (r.last ? 64 : 0) + (r.mode === j ? 128 : 0) + (r.mode === re || r.mode === Q ? 256 : 0),
(0 === w && 0 === p || t === B) && xe === O && (xe = T),
xe)
}
function h(e) {
if (!e || !e.state)
return R;
var t = e.state;
return t.window && (t.window = null),
e.state = null,
O
}
function w(e, t) {
var r;
return e && e.state ? (r = e.state,
0 === (2 & r.wrap) ? R : (r.head = t,
t.done = !1,
O)) : R
}
function p(e, t) {
var r, n, o, a = t.length;
return e && e.state ? (r = e.state,
0 !== r.wrap && r.mode !== G ? R : r.mode === G && (n = 1,
n = y(n, t, a, 0),
n !== r.check) ? C : (o = u(e, t, a, a)) ? (r.mode = he,
H) : (r.havedict = 1,
O)) : R
}
var m, b, g = e("../utils/common"), y = e("./adler32"), A = e("./crc32"), v = e("./inffast"), U = e("./inftrees"), x = 0, k = 1, E = 2, B = 4, W = 5, L = 6, O = 0, M = 1, N = 2, R = -2, C = -3, H = -4, T = -5, S = 8, I = 1, F = 2, P = 3, V = 4, D = 5, Z = 6, q = 7, Y = 8, z = 9, J = 10, G = 11, j = 12, X = 13, K = 14, Q = 15, _ = 16, $ = 17, ee = 18, te = 19, re = 20, ne = 21, oe = 22, ae = 23, ie = 24, se = 25, de = 26, le = 27, fe = 28, ue = 29, ce = 30, he = 31, we = 32, pe = 852, me = 592, be = 15, ge = be, ye = !0;
r.inflateReset = i,
r.inflateReset2 = s,
r.inflateResetKeep = a,
r.inflateInit = l,
r.inflateInit2 = d,
r.inflate = c,
r.inflateEnd = h,
r.inflateGetHeader = w,
r.inflateSetDictionary = p,
r.inflateInfo = "pako inflate (from Nodeca project)"
},
"zlib/constants.js": function(e, t, r) {
"use strict";
t.exports = {
Z_NO_FLUSH: 0,
Z_PARTIAL_FLUSH: 1,
Z_SYNC_FLUSH: 2,
Z_FULL_FLUSH: 3,
Z_FINISH: 4,
Z_BLOCK: 5,
Z_TREES: 6,
Z_OK: 0,
Z_STREAM_END: 1,
Z_NEED_DICT: 2,
Z_ERRNO: -1,
Z_STREAM_ERROR: -2,
Z_DATA_ERROR: -3,
Z_BUF_ERROR: -5,
Z_NO_COMPRESSION: 0,
Z_BEST_SPEED: 1,
Z_BEST_COMPRESSION: 9,
Z_DEFAULT_COMPRESSION: -1,
Z_FILTERED: 1,
Z_HUFFMAN_ONLY: 2,
Z_RLE: 3,
Z_FIXED: 4,
Z_DEFAULT_STRATEGY: 0,
Z_BINARY: 0,
Z_TEXT: 1,
Z_UNKNOWN: 2,
Z_DEFLATED: 8
}
},
"zlib/messages.js": function(e, t, r) {
"use strict";
t.exports = {
2: "need dictionary",
1: "stream end",
0: "",
"-1": "file error",
"-2": "stream error",
"-3": "data error",
"-4": "insufficient memory",
"-5": "buffer error",
"-6": "incompatible version"
}
},
"zlib/zstream.js": function(e, t, r) {
"use strict";
function n() {
this.input = null,
this.next_in = 0,
this.avail_in = 0,
this.total_in = 0,
this.output = null,
this.next_out = 0,
this.avail_out = 0,
this.total_out = 0,
this.msg = "",
this.state = null,
this.data_type = 2,
this.adler = 0
}
t.exports = n
},
"zlib/gzheader.js": function(e, t, r) {
"use strict";
function n() {
this.text = 0,
this.time = 0,
this.xflags = 0,
this.os = 0,
this.extra = null,
this.extra_len = 0,
this.name = "",
this.comment = "",
this.hcrc = 0,
this.done = !1
}
t.exports = n
},
"zlib/adler32.js": function(e, t, r) {
"use strict";
function n(e, t, r, n) {
for (var o = 65535 & e | 0, a = e >>> 16 & 65535 | 0, i = 0; 0 !== r; ) {
i = r > 2e3 ? 2e3 : r,
r -= i;
do
o = o + t[n++] | 0,
a = a + o | 0;
while (--i);o %= 65521,
a %= 65521
}
return o | a << 16 | 0
}
t.exports = n
},
"zlib/crc32.js": function(e, t, r) {
"use strict";
function n() {
for (var e, t = [], r = 0; r < 256; r++) {
e = r;
for (var n = 0; n < 8; n++)
e = 1 & e ? 3988292384 ^ e >>> 1 : e >>> 1;
t[r] = e
}
return t
}
function o(e, t, r, n) {
var o = a
, i = n + r;
e ^= -1;
for (var s = n; s < i; s++)
e = e >>> 8 ^ o[255 & (e ^ t[s])];
return e ^ -1
}
var a = n();
t.exports = o
},
"zlib/inffast.js": function(e, t, r) {
"use strict";
var n = 30
, o = 12;
t.exports = function(e, t) {
var r, a, i, s, d, l, f, u, c, h, w, p, m, b, g, y, A, v, U, x, k, E, B, W, L;
r = e.state,
a = e.next_in,
W = e.input,
i = a + (e.avail_in - 5),
s = e.next_out,
L = e.output,
d = s - (t - e.avail_out),
l = s + (e.avail_out - 257),
f = r.dmax,
u = r.wsize,
c = r.whave,
h = r.wnext,
w = r.window,
p = r.hold,
m = r.bits,
b = r.lencode,
g = r.distcode,
y = (1 << r.lenbits) - 1,
A = (1 << r.distbits) - 1;
e: do {
m < 15 && (p += W[a++] << m,
m += 8,
p += W[a++] << m,
m += 8),
v = b[p & y];
t: for (; ; ) {
if (U = v >>> 24,
p >>>= U,
m -= U,
U = v >>> 16 & 255,
0 === U)
L[s++] = 65535 & v;
else {
if (!(16 & U)) {
if (0 === (64 & U)) {
v = b[(65535 & v) + (p & (1 << U) - 1)];
continue t
}
if (32 & U) {
r.mode = o;
break e
}
e.msg = "invalid literal/length code",
r.mode = n;
break e
}
x = 65535 & v,
U &= 15,
U && (m < U && (p += W[a++] << m,
m += 8),
x += p & (1 << U) - 1,
p >>>= U,
m -= U),
m < 15 && (p += W[a++] << m,
m += 8,
p += W[a++] << m,
m += 8),
v = g[p & A];
r: for (; ; ) {
if (U = v >>> 24,
p >>>= U,
m -= U,
U = v >>> 16 & 255,
!(16 & U)) {
if (0 === (64 & U)) {
v = g[(65535 & v) + (p & (1 << U) - 1)];
continue r
}
e.msg = "invalid distance code",
r.mode = n;
break e
}
if (k = 65535 & v,
U &= 15,
m < U && (p += W[a++] << m,
m += 8,
m < U && (p += W[a++] << m,
m += 8)),
k += p & (1 << U) - 1,
k > f) {
e.msg = "invalid distance too far back",
r.mode = n;
break e
}
if (p >>>= U,
m -= U,
U = s - d,
k > U) {
if (U = k - U,
U > c && r.sane) {
e.msg = "invalid distance too far back",
r.mode = n;
break e
}
if (E = 0,
B = w,
0 === h) {
if (E += u - U,
U < x) {
x -= U;
do
L[s++] = w[E++];
while (--U);E = s - k,
B = L
}
} else if (h < U) {
if (E += u + h - U,
U -= h,
U < x) {
x -= U;
do
L[s++] = w[E++];
while (--U);if (E = 0,
h < x) {
U = h,
x -= U;
do
L[s++] = w[E++];
while (--U);E = s - k,
B = L
}
}
} else if (E += h - U,
U < x) {
x -= U;
do
L[s++] = w[E++];
while (--U);E = s - k,
B = L
}
for (; x > 2; )
L[s++] = B[E++],
L[s++] = B[E++],
L[s++] = B[E++],
x -= 3;
x && (L[s++] = B[E++],
x > 1 && (L[s++] = B[E++]))
} else {
E = s - k;
do
L[s++] = L[E++],
L[s++] = L[E++],
L[s++] = L[E++],
x -= 3;
while (x > 2);x && (L[s++] = L[E++],
x > 1 && (L[s++] = L[E++]))
}
break
}
}
break
}
} while (a < i && s < l);x = m >> 3,
a -= x,
m -= x << 3,
p &= (1 << m) - 1,
e.next_in = a,
e.next_out = s,
e.avail_in = a < i ? 5 + (i - a) : 5 - (a - i),
e.avail_out = s < l ? 257 + (l - s) : 257 - (s - l),
r.hold = p,
r.bits = m
}
},
"zlib/inftrees.js": function(e, t, r) {
"use strict";
var n = e("../utils/common")
, o = 15
, a = 852
, i = 592
, s = 0
, d = 1
, l = 2
, f = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0]
, u = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78]
, c = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0]
, h = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];
t.exports = function(e, t, r, w, p, m, b, g) {
var y, A, v, U, x, k, E, B, W, L = g.bits, O = 0, M = 0, N = 0, R = 0, C = 0, H = 0, T = 0, S = 0, I = 0, F = 0, P = null, V = 0, D = new n.Buf16(o + 1), Z = new n.Buf16(o + 1), q = null, Y = 0;
for (O = 0; O <= o; O++)
D[O] = 0;
for (M = 0; M < w; M++)
D[t[r + M]]++;
for (C = L,
R = o; R >= 1 && 0 === D[R]; R--)
;
if (C > R && (C = R),
0 === R)
return p[m++] = 20971520,
p[m++] = 20971520,
g.bits = 1,
0;
for (N = 1; N < R && 0 === D[N]; N++)
;
for (C < N && (C = N),
S = 1,
O = 1; O <= o; O++)
if (S <<= 1,
S -= D[O],
S < 0)
return -1;
if (S > 0 && (e === s || 1 !== R))
return -1;
for (Z[1] = 0,
O = 1; O < o; O++)
Z[O + 1] = Z[O] + D[O];
for (M = 0; M < w; M++)
0 !== t[r + M] && (b[Z[t[r + M]]++] = M);
if (e === s ? (P = q = b,
k = 19) : e === d ? (P = f,
V -= 257,
q = u,
Y -= 257,
k = 256) : (P = c,
q = h,
k = -1),
F = 0,
M = 0,
O = N,
x = m,
H = C,
T = 0,
v = -1,
I = 1 << C,
U = I - 1,
e === d && I > a || e === l && I > i)
return 1;
for (; ; ) {
E = O - T,
b[M] < k ? (B = 0,
W = b[M]) : b[M] > k ? (B = q[Y + b[M]],
W = P[V + b[M]]) : (B = 96,
W = 0),
y = 1 << O - T,
A = 1 << H,
N = A;
do
A -= y,
p[x + (F >> T) + A] = E << 24 | B << 16 | W | 0;
while (0 !== A);for (y = 1 << O - 1; F & y; )
y >>= 1;
if (0 !== y ? (F &= y - 1,
F += y) : F = 0,
M++,
0 === --D[O]) {
if (O === R)
break;
O = t[r + b[M]]
}
if (O > C && (F & U) !== v) {
for (0 === T && (T = C),
x += N,
H = O - T,
S = 1 << H; H + T < R && (S -= D[H + T],
!(S <= 0)); )
H++,
S <<= 1;
if (I += 1 << H,
e === d && I > a || e === l && I > i)
return 1;
v = F & U,
p[v] = C << 24 | H << 16 | x - m | 0
}
}
return 0 !== F && (p[x + F] = O - T << 24 | 64 << 16 | 0),
g.bits = C,
0
}
}
};
for (var r in t)
t[r].folder = r.substring(0, r.lastIndexOf("/") + 1);
var n = function(e) {
var r = [];
return e = e.split("/").every(function(e) {
return ".." == e ? r.pop() : "." == e || "" == e || r.push(e)
}) ? r.join("/") : null,
e ? t[e] || t[e + ".js"] || t[e + "/index.js"] : null
}
, o = function(e, t) {
return e ? n(e.folder + "node_modules/" + t) || o(e.parent, t) : null
}
, a = function(e, t) {
var r = t.match(/^\//) ? null : e ? t.match(/^\.\.?\//) ? n(e.folder + t) : o(e, t) : n(t);
if (!r)
throw "module not found: " + t;
return r.exports || (r.parent = e,
r(a.bind(null, r), r, r.exports = {})),
r.exports
};
return a(null, e)
},
decompress: function(e) {
this.exports || (this.exports = this.require("inflate.js"));
try {
return this.exports.inflate(e)
} catch (e) {}
},
hasUnityMarker: function(e) {
var t = 10
, r = "UnityWeb Compressed Content (gzip)";
if (t > e.length || 31 != e[0] || 139 != e[1])
return !1;
var n = e[3];
if (4 & n) {
if (t + 2 > e.length)
return !1;
if (t += 2 + e[t] + (e[t + 1] << 8),
t > e.length)
return !1
}
if (8 & n) {
for (; t < e.length && e[t]; )
t++;
if (t + 1 > e.length)
return !1;
t++
}
return 16 & n && String.fromCharCode.apply(null, e.subarray(t, t + r.length + 1)) == r + "\0"
}
},
brotli: {
require: function(e) {
var t = {
"decompress.js": function(e, t, r) {
t.exports = e("./dec/decode").BrotliDecompressBuffer
},
"dec/bit_reader.js": function(e, t, r) {
function n(e) {
this.buf_ = new Uint8Array(a),
this.input_ = e,
this.reset()
}
const o = 4096
, a = 8224
, i = 8191
, s = new Uint32Array([0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215]);
n.READ_SIZE = o,
n.IBUF_MASK = i,
n.prototype.reset = function() {
this.buf_ptr_ = 0,
this.val_ = 0,
this.pos_ = 0,
this.bit_pos_ = 0,
this.bit_end_pos_ = 0,
this.eos_ = 0,
this.readMoreInput();
for (var e = 0; e < 4; e++)
this.val_ |= this.buf_[this.pos_] << 8 * e,
++this.pos_;
return this.bit_end_pos_ > 0
}
,
n.prototype.readMoreInput = function() {
if (!(this.bit_end_pos_ > 256))
if (this.eos_) {
if (this.bit_pos_ > this.bit_end_pos_)
throw new Error("Unexpected end of input " + this.bit_pos_ + " " + this.bit_end_pos_)
} else {
var e = this.buf_ptr_
, t = this.input_.read(this.buf_, e, o);
if (t < 0)
throw new Error("Unexpected end of input");
if (t < o) {
this.eos_ = 1;
for (var r = 0; r < 32; r++)
this.buf_[e + t + r] = 0
}
if (0 === e) {
for (var r = 0; r < 32; r++)
this.buf_[8192 + r] = this.buf_[r];
this.buf_ptr_ = o
} else
this.buf_ptr_ = 0;
this.bit_end_pos_ += t << 3
}
}
,
n.prototype.fillBitWindow = function() {
for (; this.bit_pos_ >= 8; )
this.val_ >>>= 8,
this.val_ |= this.buf_[this.pos_ & i] << 24,
++this.pos_,
this.bit_pos_ = this.bit_pos_ - 8 >>> 0,
this.bit_end_pos_ = this.bit_end_pos_ - 8 >>> 0
}
,
n.prototype.readBits = function(e) {
32 - this.bit_pos_ < e && this.fillBitWindow();
var t = this.val_ >>> this.bit_pos_ & s[e];
return this.bit_pos_ += e,
t
}
,
t.exports = n
},
"dec/context.js": function(e, t, r) {
r.lookup = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12, 12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12, 12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
r.lookupOffsets = new Uint16Array([1024, 1536, 1280, 1536, 0, 256, 768, 512])
},
"dec/decode.js": function(e, t, r) {
function n(e) {
var t;
return 0 === e.readBits(1) ? 16 : (t = e.readBits(3),
t > 0 ? 17 + t : (t = e.readBits(3),
t > 0 ? 8 + t : 17))
}
function o(e) {
if (e.readBits(1)) {
var t = e.readBits(3);
return 0 === t ? 1 : e.readBits(t) + (1 << t)
}
return 0
}
function a() {
this.meta_block_length = 0,
this.input_end = 0,
this.is_uncompressed = 0,
this.is_metadata = !1
}
function i(e) {
var t, r, n, o = new a;
if (o.input_end = e.readBits(1),
o.input_end && e.readBits(1))
return o;
if (t = e.readBits(2) + 4,
7 === t) {
if (o.is_metadata = !0,
0 !== e.readBits(1))
throw new Error("Invalid reserved bit");
if (r = e.readBits(2),
0 === r)
return o;
for (n = 0; n < r; n++) {
var i = e.readBits(8);
if (n + 1 === r && r > 1 && 0 === i)
throw new Error("Invalid size byte");
o.meta_block_length |= i << 8 * n
}
} else
for (n = 0; n < t; ++n) {
var s = e.readBits(4);
if (n + 1 === t && t > 4 && 0 === s)
throw new Error("Invalid size nibble");
o.meta_block_length |= s << 4 * n
}
return ++o.meta_block_length,
o.input_end || o.is_metadata || (o.is_uncompressed = e.readBits(1)),
o
}
function s(e, t, r) {
var n;
return r.fillBitWindow(),
t += r.val_ >>> r.bit_pos_ & P,
n = e[t].bits - F,
n > 0 && (r.bit_pos_ += F,
t += e[t].value,
t += r.val_ >>> r.bit_pos_ & (1 << n) - 1),
r.bit_pos_ += e[t].bits,
e[t].value
}
function d(e, t, r, n) {
for (var o = 0, a = N, i = 0, s = 0, d = 32768, l = [], f = 0; f < 32; f++)
l.push(new B(0,0));
for (W(l, 0, 5, e, D); o < t && d > 0; ) {
var u, c = 0;
if (n.readMoreInput(),
n.fillBitWindow(),
c += n.val_ >>> n.bit_pos_ & 31,
n.bit_pos_ += l[c].bits,
u = 255 & l[c].value,
u < R)
i = 0,
r[o++] = u,
0 !== u && (a = u,
d -= 32768 >> u);
else {
var h, w, p = u - 14, m = 0;
if (u === R && (m = a),
s !== m && (i = 0,
s = m),
h = i,
i > 0 && (i -= 2,
i <<= p),
i += n.readBits(p) + 3,
w = i - h,
o + w > t)
throw new Error("[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols");
for (var b = 0; b < w; b++)
r[o + b] = s;
o += w,
0 !== s && (d -= w << 15 - s)
}
}
if (0 !== d)
throw new Error("[ReadHuffmanCodeLengths] space = " + d);
for (; o < t; o++)
r[o] = 0
}
function l(e, t, r, n) {
var o, a = 0, i = new Uint8Array(e);
if (n.readMoreInput(),
o = n.readBits(2),
1 === o) {
for (var s, l = e - 1, f = 0, u = new Int32Array(4), c = n.readBits(2) + 1; l; )
l >>= 1,
++f;
for (s = 0; s < c; ++s)
u[s] = n.readBits(f) % e,
i[u[s]] = 2;
switch (i[u[0]] = 1,
c) {
case 1:
break;
case 3:
if (u[0] === u[1] || u[0] === u[2] || u[1] === u[2])
throw new Error("[ReadHuffmanCode] invalid symbols");
break;
case 2:
if (u[0] === u[1])
throw new Error("[ReadHuffmanCode] invalid symbols");
i[u[1]] = 1;
break;
case 4:
if (u[0] === u[1] || u[0] === u[2] || u[0] === u[3] || u[1] === u[2] || u[1] === u[3] || u[2] === u[3])
throw new Error("[ReadHuffmanCode] invalid symbols");
n.readBits(1) ? (i[u[2]] = 3,
i[u[3]] = 3) : i[u[0]] = 2
}
} else {
var s, h = new Uint8Array(D), w = 32, p = 0, m = [new B(2,0), new B(2,4), new B(2,3), new B(3,2), new B(2,0), new B(2,4), new B(2,3), new B(4,1), new B(2,0), new B(2,4), new B(2,3), new B(3,2), new B(2,0), new B(2,4), new B(2,3), new B(4,5)];
for (s = o; s < D && w > 0; ++s) {
var b, g = Z[s], y = 0;
n.fillBitWindow(),
y += n.val_ >>> n.bit_pos_ & 15,
n.bit_pos_ += m[y].bits,
b = m[y].value,
h[g] = b,
0 !== b && (w -= 32 >> b,
++p)
}
if (1 !== p && 0 !== w)
throw new Error("[ReadHuffmanCode] invalid num_codes or space");
d(h, e, i, n)
}
if (a = W(t, r, F, i, e),
0 === a)
throw new Error("[ReadHuffmanCode] BuildHuffmanTable failed: ");
return a
}
function f(e, t, r) {
var n, o;
return n = s(e, t, r),
o = O.kBlockLengthPrefixCode[n].nbits,
O.kBlockLengthPrefixCode[n].offset + r.readBits(o)
}
function u(e, t, r) {
var n;
return e < q ? (r += Y[e],
r &= 3,
n = t[r] + z[e]) : n = e - q + 1,
n
}
function c(e, t) {
for (var r = e[t], n = t; n; --n)
e[n] = e[n - 1];
e[0] = r
}
function h(e, t) {
var r, n = new Uint8Array(256);
for (r = 0; r < 256; ++r)
n[r] = r;
for (r = 0; r < t; ++r) {
var o = e[r];
e[r] = n[o],
o && c(n, o)
}
}
function w(e, t) {
this.alphabet_size = e,
this.num_htrees = t,
this.codes = new Array(t + t * J[e + 31 >>> 5]),
this.htrees = new Uint32Array(t)
}
function p(e, t) {
var r, n, a, i = {
num_htrees: null,
context_map: null
}, d = 0;
t.readMoreInput();
var f = i.num_htrees = o(t) + 1
, u = i.context_map = new Uint8Array(e);
if (f <= 1)
return i;
for (r = t.readBits(1),
r && (d = t.readBits(4) + 1),
n = [],
a = 0; a < V; a++)
n[a] = new B(0,0);
for (l(f + d, n, 0, t),
a = 0; a < e; ) {
var c;
if (t.readMoreInput(),
c = s(n, 0, t),
0 === c)
u[a] = 0,
++a;
else if (c <= d)
for (var w = 1 + (1 << c) + t.readBits(c); --w; ) {
if (a >= e)
throw new Error("[DecodeContextMap] i >= context_map_size");
u[a] = 0,
++a
}
else
u[a] = c - d,
++a
}
return t.readBits(1) && h(u, e),
i
}
function m(e, t, r, n, o, a, i) {
var d, l = 2 * r, f = r, u = s(t, r * V, i);
d = 0 === u ? o[l + (1 & a[f])] : 1 === u ? o[l + (a[f] - 1 & 1)] + 1 : u - 2,
d >= e && (d -= e),
n[r] = d,
o[l + (1 & a[f])] = d,
++a[f]
}
function b(e, t, r, n, o, a) {
var i, s = o + 1, d = r & o, l = a.pos_ & k.IBUF_MASK;
if (t < 8 || a.bit_pos_ + (t << 3) < a.bit_end_pos_)
for (; t-- > 0; )
a.readMoreInput(),
n[d++] = a.readBits(8),
d === s && (e.write(n, s),
d = 0);
else {
if (a.bit_end_pos_ < 32)
throw new Error("[CopyUncompressedBlockToOutput] br.bit_end_pos_ < 32");
for (; a.bit_pos_ < 32; )
n[d] = a.val_ >>> a.bit_pos_,
a.bit_pos_ += 8,
++d,
--t;
if (i = a.bit_end_pos_ - a.bit_pos_ >> 3,
l + i > k.IBUF_MASK) {
for (var f = k.IBUF_MASK + 1 - l, u = 0; u < f; u++)
n[d + u] = a.buf_[l + u];
i -= f,
d += f,
t -= f,
l = 0
}
for (var u = 0; u < i; u++)
n[d + u] = a.buf_[l + u];
if (d += i,
t -= i,
d >= s) {
e.write(n, s),
d -= s;
for (var u = 0; u < d; u++)
n[u] = n[s + u]
}
for (; d + t >= s; ) {
if (i = s - d,
a.input_.read(n, d, i) < i)
throw new Error("[CopyUncompressedBlockToOutput] not enough bytes");
e.write(n, s),
t -= i,
d = 0
}
if (a.input_.read(n, d, t) < t)
throw new Error("[CopyUncompressedBlockToOutput] not enough bytes");
a.reset()
}
}
function g(e) {
var t = e.bit_pos_ + 7 & -8
, r = e.readBits(t - e.bit_pos_);
return 0 == r
}
function y(e) {
var t = new U(e)
, r = new k(t);
n(r);
var o = i(r);
return o.meta_block_length
}
function A(e, t) {
var r = new U(e);
null == t && (t = y(e));
var n = new Uint8Array(t)
, o = new x(n);
return v(r, o),
o.pos < o.buffer.length && (o.buffer = o.buffer.subarray(0, o.pos)),
o.buffer
}
function v(e, t) {
var r, a, d, c, h, y, A, v, U, x = 0, W = 0, N = 0, R = 0, F = [16, 15, 11, 4], P = 0, D = 0, Z = 0, Y = [new w(0,0), new w(0,0), new w(0,0)];
const z = 128 + k.READ_SIZE;
U = new k(e),
N = n(U),
a = (1 << N) - 16,
d = 1 << N,
c = d - 1,
h = new Uint8Array(d + z + E.maxDictionaryWordLength),
y = d,
A = [],
v = [];
for (var J = 0; J < 3240; J++)
A[J] = new B(0,0),
v[J] = new B(0,0);
for (; !W; ) {
var G, j, X, K, Q, _, $, ee, te, re = 0, ne = [1 << 28, 1 << 28, 1 << 28], oe = [0], ae = [1, 1, 1], ie = [0, 1, 0, 1, 0, 1], se = [0], de = null, le = null, fe = null, ue = 0, ce = null, he = 0, we = 0, pe = null, me = 0, be = 0, ge = 0;
for (r = 0; r < 3; ++r)
Y[r].codes = null,
Y[r].htrees = null;
U.readMoreInput();
var ye = i(U);
if (re = ye.meta_block_length,
x + re > t.buffer.length) {
var Ae = new Uint8Array(x + re);
Ae.set(t.buffer),
t.buffer = Ae
}
if (W = ye.input_end,
G = ye.is_uncompressed,
ye.is_metadata)
for (g(U); re > 0; --re)
U.readMoreInput(),
U.readBits(8);
else if (0 !== re)
if (G)
U.bit_pos_ = U.bit_pos_ + 7 & -8,
b(t, re, x, h, c, U),
x += re;
else {
for (r = 0; r < 3; ++r)
ae[r] = o(U) + 1,
ae[r] >= 2 && (l(ae[r] + 2, A, r * V, U),
l(T, v, r * V, U),
ne[r] = f(v, r * V, U),
se[r] = 1);
for (U.readMoreInput(),
j = U.readBits(2),
X = q + (U.readBits(4) << j),
K = (1 << j) - 1,
Q = X + (48 << j),
le = new Uint8Array(ae[0]),
r = 0; r < ae[0]; ++r)
U.readMoreInput(),
le[r] = U.readBits(2) << 1;
var ve = p(ae[0] << S, U);
_ = ve.num_htrees,
de = ve.context_map;
var Ue = p(ae[2] << I, U);
for ($ = Ue.num_htrees,
fe = Ue.context_map,
Y[0] = new w(C,_),
Y[1] = new w(H,ae[1]),
Y[2] = new w(Q,$),
r = 0; r < 3; ++r)
Y[r].decode(U);
for (ce = 0,
pe = 0,
ee = le[oe[0]],
be = L.lookupOffsets[ee],
ge = L.lookupOffsets[ee + 1],
te = Y[1].htrees[0]; re > 0; ) {
var xe, ke, Ee, Be, We, Le, Oe, Me, Ne, Re, Ce;
for (U.readMoreInput(),
0 === ne[1] && (m(ae[1], A, 1, oe, ie, se, U),
ne[1] = f(v, V, U),
te = Y[1].htrees[oe[1]]),
--ne[1],
xe = s(Y[1].codes, te, U),
ke = xe >> 6,
ke >= 2 ? (ke -= 2,
Oe = -1) : Oe = 0,
Ee = O.kInsertRangeLut[ke] + (xe >> 3 & 7),
Be = O.kCopyRangeLut[ke] + (7 & xe),
We = O.kInsertLengthPrefixCode[Ee].offset + U.readBits(O.kInsertLengthPrefixCode[Ee].nbits),
Le = O.kCopyLengthPrefixCode[Be].offset + U.readBits(O.kCopyLengthPrefixCode[Be].nbits),
D = h[x - 1 & c],
Z = h[x - 2 & c],
Re = 0; Re < We; ++Re)
U.readMoreInput(),
0 === ne[0] && (m(ae[0], A, 0, oe, ie, se, U),
ne[0] = f(v, 0, U),
ue = oe[0] << S,
ce = ue,
ee = le[oe[0]],
be = L.lookupOffsets[ee],
ge = L.lookupOffsets[ee + 1]),
Ne = L.lookup[be + D] | L.lookup[ge + Z],
he = de[ce + Ne],
--ne[0],
Z = D,
D = s(Y[0].codes, Y[0].htrees[he], U),
h[x & c] = D,
(x & c) === c && t.write(h, d),
++x;
if (re -= We,
re <= 0)
break;
if (Oe < 0) {
var Ne;
if (U.readMoreInput(),
0 === ne[2] && (m(ae[2], A, 2, oe, ie, se, U),
ne[2] = f(v, 2160, U),
we = oe[2] << I,
pe = we),
--ne[2],
Ne = 255 & (Le > 4 ? 3 : Le - 2),
me = fe[pe + Ne],
Oe = s(Y[2].codes, Y[2].htrees[me], U),
Oe >= X) {
var He, Te, Se;
Oe -= X,
Te = Oe & K,
Oe >>= j,
He = (Oe >> 1) + 1,
Se = (2 + (1 & Oe) << He) - 4,
Oe = X + (Se + U.readBits(He) << j) + Te
}
}
if (Me = u(Oe, F, P),
Me < 0)
throw new Error("[BrotliDecompress] invalid distance");
if (R = x < a && R !== a ? x : a,
Ce = x & c,
Me > R) {
if (!(Le >= E.minDictionaryWordLength && Le <= E.maxDictionaryWordLength))
throw new Error("Invalid backward reference. pos: " + x + " distance: " + Me + " len: " + Le + " bytes left: " + re);
var Se = E.offsetsByLength[Le]
, Ie = Me - R - 1
, Fe = E.sizeBitsByLength[Le]
, Pe = (1 << Fe) - 1
, Ve = Ie & Pe
, De = Ie >> Fe;
if (Se += Ve * Le,
!(De < M.kNumTransforms))
throw new Error("Invalid backward reference. pos: " + x + " distance: " + Me + " len: " + Le + " bytes left: " + re);
var Ze = M.transformDictionaryWord(h, Ce, Se, Le, De);
if (Ce += Ze,
x += Ze,
re -= Ze,
Ce >= y) {
t.write(h, d);
for (var qe = 0; qe < Ce - y; qe++)
h[qe] = h[y + qe]
}
} else {
if (Oe > 0 && (F[3 & P] = Me,
++P),
Le > re)
throw new Error("Invalid backward reference. pos: " + x + " distance: " + Me + " len: " + Le + " bytes left: " + re);
for (Re = 0; Re < Le; ++Re)
h[x & c] = h[x - Me & c],
(x & c) === c && t.write(h, d),
++x,
--re
}
D = h[x - 1 & c],
Z = h[x - 2 & c]
}
x &= 1073741823
}
}
t.write(h, x & c)
}
var U = e("./streams").BrotliInput
, x = e("./streams").BrotliOutput
, k = e("./bit_reader")
, E = e("./dictionary")
, B = e("./huffman").HuffmanCode
, W = e("./huffman").BrotliBuildHuffmanTable
, L = e("./context")
, O = e("./prefix")
, M = e("./transform");
const N = 8
, R = 16
, C = 256
, H = 704
, T = 26
, S = 6
, I = 2
, F = 8
, P = 255
, V = 1080
, D = 18
, Z = new Uint8Array([1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15])
, q = 16
, Y = new Uint8Array([3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2])
, z = new Int8Array([0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3])
, J = new Uint16Array([256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822, 854, 886, 920, 952, 984, 1016, 1048, 1080]);
w.prototype.decode = function(e) {
var t, r, n = 0;
for (t = 0; t < this.num_htrees; ++t)
this.htrees[t] = n,
r = l(this.alphabet_size, this.codes, n, e),
n += r
}
,
r.BrotliDecompressedSize = y,
r.BrotliDecompressBuffer = A,
r.BrotliDecompress = v,
E.init()
},
"dec/dictionary.js": function(e, t, r) {
var n = e("./dictionary-browser");
r.init = function() {
r.dictionary = n.init()
}
,
r.offsetsByLength = new Uint32Array([0, 0, 0, 0, 0, 4096, 9216, 21504, 35840, 44032, 53248, 63488, 74752, 87040, 93696, 100864, 104704, 106752, 108928, 113536, 115968, 118528, 119872, 121280, 122016]),
r.sizeBitsByLength = new Uint8Array([0, 0, 0, 0, 10, 10, 11, 11, 10, 10, 10, 10, 10, 9, 9, 8, 7, 7, 8, 7, 7, 6, 6, 5, 5]),
r.minDictionaryWordLength = 4,
r.maxDictionaryWordLength = 24
},
"dec/dictionary.bin.js": function(e, t, r) {
t.exports = "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";
},
"dec/dictionary-browser.js": function(e, t, r) {
var n = e("base64-js");
r.init = function() {
var t = e("./decode").BrotliDecompressBuffer
, r = n.toByteArray(e("./dictionary.bin.js"));
return t(r)
}
},
"dec/huffman.js": function(e, t, r) {
function n(e, t) {
this.bits = e,
this.value = t
}
function o(e, t) {
for (var r = 1 << t - 1; e & r; )
r >>= 1;
return (e & r - 1) + r
}
function a(e, t, r, o, a) {
do
o -= r,
e[t + o] = new n(a.bits,a.value);
while (o > 0)
}
function i(e, t, r) {
for (var n = 1 << t - r; t < s && (n -= e[t],
!(n <= 0)); )
++t,
n <<= 1;
return t - r
}
r.HuffmanCode = n;
const s = 15;
r.BrotliBuildHuffmanTable = function(e, t, r, d, l) {
var f, u, c, h, w, p, m, b, g, y, A, v = t, U = new Int32Array(16), x = new Int32Array(16);
for (A = new Int32Array(l),
c = 0; c < l; c++)
U[d[c]]++;
for (x[1] = 0,
u = 1; u < s; u++)
x[u + 1] = x[u] + U[u];
for (c = 0; c < l; c++)
0 !== d[c] && (A[x[d[c]]++] = c);
if (b = r,
g = 1 << b,
y = g,
1 === x[s]) {
for (h = 0; h < y; ++h)
e[t + h] = new n(0,65535 & A[0]);
return y
}
for (h = 0,
c = 0,
u = 1,
w = 2; u <= r; ++u,
w <<= 1)
for (; U[u] > 0; --U[u])
f = new n(255 & u,65535 & A[c++]),
a(e, t + h, w, g, f),
h = o(h, u);
for (m = y - 1,
p = -1,
u = r + 1,
w = 2; u <= s; ++u,
w <<= 1)
for (; U[u] > 0; --U[u])
(h & m) !== p && (t += g,
b = i(U, u, r),
g = 1 << b,
y += g,
p = h & m,
e[v + p] = new n(b + r & 255,t - v - p & 65535)),
f = new n(u - r & 255,65535 & A[c++]),
a(e, t + (h >> r), w, g, f),
h = o(h, u);
return y
}
},
"dec/prefix.js": function(e, t, r) {
function n(e, t) {
this.offset = e,
this.nbits = t
}
r.kBlockLengthPrefixCode = [new n(1,2), new n(5,2), new n(9,2), new n(13,2), new n(17,3), new n(25,3), new n(33,3), new n(41,3), new n(49,4), new n(65,4), new n(81,4), new n(97,4), new n(113,5), new n(145,5), new n(177,5), new n(209,5), new n(241,6), new n(305,6), new n(369,7), new n(497,8), new n(753,9), new n(1265,10), new n(2289,11), new n(4337,12), new n(8433,13), new n(16625,24)],
r.kInsertLengthPrefixCode = [new n(0,0), new n(1,0), new n(2,0), new n(3,0), new n(4,0), new n(5,0), new n(6,1), new n(8,1), new n(10,2), new n(14,2), new n(18,3), new n(26,3), new n(34,4), new n(50,4), new n(66,5), new n(98,5), new n(130,6), new n(194,7), new n(322,8), new n(578,9), new n(1090,10), new n(2114,12), new n(6210,14), new n(22594,24)],
r.kCopyLengthPrefixCode = [new n(2,0), new n(3,0), new n(4,0), new n(5,0), new n(6,0), new n(7,0), new n(8,0), new n(9,0), new n(10,1), new n(12,1), new n(14,2), new n(18,2), new n(22,3), new n(30,3), new n(38,4), new n(54,4), new n(70,5), new n(102,5), new n(134,6), new n(198,7), new n(326,8), new n(582,9), new n(1094,10), new n(2118,24)],
r.kInsertRangeLut = [0, 0, 8, 8, 0, 16, 8, 16, 16],
r.kCopyRangeLut = [0, 8, 0, 8, 16, 0, 16, 8, 16]
},
"dec/streams.js": function(e, t, r) {
function n(e) {
this.buffer = e,
this.pos = 0
}
function o(e) {
this.buffer = e,
this.pos = 0
}
n.prototype.read = function(e, t, r) {
this.pos + r > this.buffer.length && (r = this.buffer.length - this.pos);
for (var n = 0; n < r; n++)
e[t + n] = this.buffer[this.pos + n];
return this.pos += r,
r
}
,
r.BrotliInput = n,
o.prototype.write = function(e, t) {
if (this.pos + t > this.buffer.length)
throw new Error("Output buffer is not large enough");
return this.buffer.set(e.subarray(0, t), this.pos),
this.pos += t,
t
}
,
r.BrotliOutput = o
},
"dec/transform.js": function(e, t, r) {
function n(e, t, r) {
this.prefix = new Uint8Array(e.length),
this.transform = t,
this.suffix = new Uint8Array(r.length);
for (var n = 0; n < e.length; n++)
this.prefix[n] = e.charCodeAt(n);
for (var n = 0; n < r.length; n++)
this.suffix[n] = r.charCodeAt(n)
}
function o(e, t) {
return e[t] < 192 ? (e[t] >= 97 && e[t] <= 122 && (e[t] ^= 32),
1) : e[t] < 224 ? (e[t + 1] ^= 32,
2) : (e[t + 2] ^= 5,
3)
}
var a = e("./dictionary");
const i = 0
, s = 1
, d = 2
, l = 3
, f = 4
, u = 5
, c = 6
, h = 7
, w = 8
, p = 9
, m = 10
, b = 11
, g = 12
, y = 13
, A = 14
, v = 15
, U = 16
, x = 17
, k = 18
, E = 20;
var B = [new n("",i,""), new n("",i," "), new n(" ",i," "), new n("",g,""), new n("",m," "), new n("",i," the "), new n(" ",i,""), new n("s ",i," "), new n("",i," of "), new n("",m,""), new n("",i," and "), new n("",y,""), new n("",s,""), new n(", ",i," "), new n("",i,", "), new n(" ",m," "), new n("",i," in "), new n("",i," to "), new n("e ",i," "), new n("",i,'"'), new n("",i,"."), new n("",i,'">'), new n("",i,"\n"), new n("",l,""), new n("",i,"]"), new n("",i," for "), new n("",A,""), new n("",d,""), new n("",i," a "), new n("",i," that "), new n(" ",m,""), new n("",i,". "), new n(".",i,""), new n(" ",i,", "), new n("",v,""), new n("",i," with "), new n("",i,"'"), new n("",i," from "), new n("",i," by "), new n("",U,""), new n("",x,""), new n(" the ",i,""), new n("",f,""), new n("",i,". The "), new n("",b,""), new n("",i," on "), new n("",i," as "), new n("",i," is "), new n("",h,""), new n("",s,"ing "), new n("",i,"\n\t"), new n("",i,":"), new n(" ",i,". "), new n("",i,"ed "), new n("",E,""), new n("",k,""), new n("",c,""), new n("",i,"("), new n("",m,", "), new n("",w,""), new n("",i," at "), new n("",i,"ly "), new n(" the ",i," of "), new n("",u,""), new n("",p,""), new n(" ",m,", "), new n("",m,'"'), new n(".",i,"("), new n("",b," "), new n("",m,'">'), new n("",i,'="'), new n(" ",i,"."), new n(".com/",i,""), new n(" the ",i," of the "), new n("",m,"'"), new n("",i,". This "), new n("",i,","), new n(".",i," "), new n("",m,"("), new n("",m,"."), new n("",i," not "), new n(" ",i,'="'), new n("",i,"er "), new n(" ",b," "), new n("",i,"al "), new n(" ",b,""), new n("",i,"='"), new n("",b,'"'), new n("",m,". "), new n(" ",i,"("), new n("",i,"ful "), new n(" ",m,". "), new n("",i,"ive "), new n("",i,"less "), new n("",b,"'"), new n("",i,"est "), new n(" ",m,"."), new n("",b,'">'), new n(" ",i,"='"), new n("",m,","), new n("",i,"ize "), new n("",b,"."), new n("\xc2\xa0",i,""), new n(" ",i,","), new n("",m,'="'), new n("",b,'="'), new n("",i,"ous "), new n("",b,", "), new n("",m,"='"), new n(" ",m,","), new n(" ",b,'="'), new n(" ",b,", "), new n("",b,","), new n("",b,"("), new n("",b,". "), new n(" ",b,"."), new n("",b,"='"), new n(" ",b,". "), new n(" ",m,'="'), new n(" ",b,"='"), new n(" ",m,"='")];
r.kTransforms = B,
r.kNumTransforms = B.length,
r.transformDictionaryWord = function(e, t, r, n, i) {
var s, d = B[i].prefix, l = B[i].suffix, f = B[i].transform, u = f < g ? 0 : f - 11, c = 0, h = t;
u > n && (u = n);
for (var w = 0; w < d.length; )
e[t++] = d[w++];
for (r += u,
n -= u,
f <= p && (n -= f),
c = 0; c < n; c++)
e[t++] = a.dictionary[r + c];
if (s = t - n,
f === m)
o(e, s);
else if (f === b)
for (; n > 0; ) {
var y = o(e, s);
s += y,
n -= y
}
for (var A = 0; A < l.length; )
e[t++] = l[A++];
return t - h
}
},
"node_modules/base64-js/index.js": function(e, t, r) {
"use strict";
function n(e) {
var t = e.length;
if (t % 4 > 0)
throw new Error("Invalid string. Length must be a multiple of 4");
return "=" === e[t - 2] ? 2 : "=" === e[t - 1] ? 1 : 0
}
function o(e) {
return 3 * e.length / 4 - n(e)
}
function a(e) {
var t, r, o, a, i, s, d = e.length;
i = n(e),
s = new u(3 * d / 4 - i),
o = i > 0 ? d - 4 : d;
var l = 0;
for (t = 0,
r = 0; t < o; t += 4,
r += 3)
a = f[e.charCodeAt(t)] << 18 | f[e.charCodeAt(t + 1)] << 12 | f[e.charCodeAt(t + 2)] << 6 | f[e.charCodeAt(t + 3)],
s[l++] = a >> 16 & 255,
s[l++] = a >> 8 & 255,
s[l++] = 255 & a;
return 2 === i ? (a = f[e.charCodeAt(t)] << 2 | f[e.charCodeAt(t + 1)] >> 4,
s[l++] = 255 & a) : 1 === i && (a = f[e.charCodeAt(t)] << 10 | f[e.charCodeAt(t + 1)] << 4 | f[e.charCodeAt(t + 2)] >> 2,
s[l++] = a >> 8 & 255,
s[l++] = 255 & a),
s
}
function i(e) {
return l[e >> 18 & 63] + l[e >> 12 & 63] + l[e >> 6 & 63] + l[63 & e]
}
function s(e, t, r) {
for (var n, o = [], a = t; a < r; a += 3)
n = (e[a] << 16) + (e[a + 1] << 8) + e[a + 2],
o.push(i(n));
return o.join("")
}
function d(e) {
for (var t, r = e.length, n = r % 3, o = "", a = [], i = 16383, d = 0, f = r - n; d < f; d += i)
a.push(s(e, d, d + i > f ? f : d + i));
return 1 === n ? (t = e[r - 1],
o += l[t >> 2],
o += l[t << 4 & 63],
o += "==") : 2 === n && (t = (e[r - 2] << 8) + e[r - 1],
o += l[t >> 10],
o += l[t >> 4 & 63],
o += l[t << 2 & 63],
o += "="),
a.push(o),
a.join("")
}
r.byteLength = o,
r.toByteArray = a,
r.fromByteArray = d;
for (var l = [], f = [], u = "undefined" != typeof Uint8Array ? Uint8Array : Array, c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", h = 0, w = c.length; h < w; ++h)
l[h] = c[h],
f[c.charCodeAt(h)] = h;
f["-".charCodeAt(0)] = 62,
f["_".charCodeAt(0)] = 63
}
};
for (var r in t)
t[r].folder = r.substring(0, r.lastIndexOf("/") + 1);
var n = function(e) {
var r = [];
return e = e.split("/").every(function(e) {
return ".." == e ? r.pop() : "." == e || "" == e || r.push(e)
}) ? r.join("/") : null,
e ? t[e] || t[e + ".js"] || t[e + "/index.js"] : null
}
, o = function(e, t) {
return e ? n(e.folder + "node_modules/" + t) || o(e.parent, t) : null
}
, a = function(e, t) {
var r = t.match(/^\//) ? null : e ? t.match(/^\.\.?\//) ? n(e.folder + t) : o(e, t) : n(t);
if (!r)
throw "module not found: " + t;
return r.exports || (r.parent = e,
r(a.bind(null, r), r, r.exports = {})),
r.exports
};
return a(null, e)
},
decompress: function(e) {
this.exports || (this.exports = this.require("decompress.js"));
try {
return this.exports(e)
} catch (e) {}
},
hasUnityMarker: function(e) {
var t = "UnityWeb Compressed Content (brotli)";
if (!e.length)
return !1;
var r = 1 & e[0] ? 14 & e[0] ? 4 : 7 : 1
, n = e[0] & (1 << r) - 1
, o = 1 + (Math.log2(t.length - 1) >> 3);
if (commentOffset = r + 1 + 2 + 1 + 2 + (o << 3) + 7 >> 3,
17 == n || commentOffset > e.length)
return !1;
for (var a = n + (6 + (o << 4) + (t.length - 1 << 6) << r), i = 0; i < commentOffset; i++,
a >>>= 8)
if (e[i] != (255 & a))
return !1;
return String.fromCharCode.apply(null, e.subarray(commentOffset, commentOffset + t.length)) == t
}
},
decompress: function(e, t) {
var r = this.gzip.hasUnityMarker(e) ? this.gzip : this.brotli.hasUnityMarker(e) ? this.brotli : this.identity;
if ("function" != typeof t)
return r.decompress(e);
if (!r.worker) {
var n = URL.createObjectURL(new Blob(["this.require = ", r.require, "; this.decompress = ", r.decompress, "; this.onmessage = ", function(e) {
var t = {
id: e.data.id,
decompressed: this.decompress(e.data.compressed)
};
postMessage(t, t.decompressed ? [t.decompressed.buffer] : [])
}
, "; postMessage({ ready: true });"],{
type: "text/javascript"
}));
r.worker = new Worker(n),
r.worker.onmessage = function(e) {
return e.data.ready ? void URL.revokeObjectURL(n) : (this.callbacks[e.data.id](e.data.decompressed),
void delete this.callbacks[e.data.id])
}
,
r.worker.callbacks = {},
r.worker.nextCallbackId = 0
}
var o = r.worker.nextCallbackId++;
r.worker.callbacks[o] = t,
r.worker.postMessage({
id: o,
compressed: e
}, [e.buffer])
}
}
};
This file has been truncated, but you can view the full file.
UnityLoader["7a204835ae937c2b3ab5cd9517cfc805"]=(function(Module) {
Module['preRun'].push(function (){
// Initialize the IndexedDB based file system. Module['unityFileSystemInit'] allows
// developers to override this with their own function, when they want to do cloud storage
// instead.
var unityFileSystemInit = Module['unityFileSystemInit'] || function (){
if (!Module.indexedDB)
{
console.log('IndexedDB is not available. Data will not persist in cache and PlayerPrefs will not be saved.');
}
FS.mkdir('/idbfs');
FS.mount(IDBFS, {}, '/idbfs');
Module.addRunDependency('JS_FileSystem_Mount');
FS.syncfs(true, function (err) {
Module.removeRunDependency('JS_FileSystem_Mount');
});
};
unityFileSystemInit();
});
Module["SetFullscreen"] = function (fullscreen) {
if (typeof runtimeInitialized === 'undefined' || !runtimeInitialized) {
console.log ("Runtime not initialized yet.");
} else if (typeof JSEvents === 'undefined') {
console.log ("Player not loaded yet.");
} else {
var tmp = JSEvents.canPerformEventHandlerRequests;
JSEvents.canPerformEventHandlerRequests = function () { return 1; };
Module.ccall("SetFullscreen", null, ["number"], [fullscreen]);
JSEvents.canPerformEventHandlerRequests = tmp;
}
};
// The following code overrides the default Emscripten instantiation of the WebAssembly module
// as a workaround for incorrectly initialized Runtime object properties
// (module export is not available at launch time if the module is compiled asynchronously).
// This file should be removed as soon as this bug is fixed in Emscripten.
integrateWasmJS = function integrateWasmJS(Module) {
// wasm.js has several methods for creating the compiled code module here:
// * 'native-wasm' : use native WebAssembly support in the browser
// * 'interpret-s-expr': load s-expression code from a .wast and interpret
// * 'interpret-binary': load binary wasm and interpret
// * 'interpret-asm2wasm': load asm.js code, translate to wasm, and interpret
// * 'asmjs': no wasm, just load the asm.js code and use that (good for testing)
// The method can be set at compile time (BINARYEN_METHOD), or runtime by setting Module['wasmJSMethod'].
// The method can be a comma-separated list, in which case, we will try the
// options one by one. Some of them can fail gracefully, and then we can try
// the next.
// inputs
var method = Module['wasmJSMethod'] || 'native-wasm';
Module['wasmJSMethod'] = method;
var wasmTextFile = Module['wasmTextFile'] || 'build.wast';
var wasmBinaryFile = Module['wasmBinaryFile'] || 'build.wasm';
var asmjsCodeFile = Module['asmjsCodeFile'] || 'build.asm.js';
// utilities
var wasmPageSize = 64*1024;
var asm2wasmImports = { // special asm2wasm imports
"f64-rem": function(x, y) {
return x % y;
},
"f64-to-int": function(x) {
return x | 0;
},
"i32s-div": function(x, y) {
return ((x | 0) / (y | 0)) | 0;
},
"i32u-div": function(x, y) {
return ((x >>> 0) / (y >>> 0)) >>> 0;
},
"i32s-rem": function(x, y) {
return ((x | 0) % (y | 0)) | 0;
},
"i32u-rem": function(x, y) {
return ((x >>> 0) % (y >>> 0)) >>> 0;
},
"debugger": function() {
debugger;
},
};
var info = {
'global': null,
'env': null,
'asm2wasm': asm2wasmImports,
'parent': Module // Module inside wasm-js.cpp refers to wasm-js.cpp; this allows access to the outside program.
};
var exports = null;
function lookupImport(mod, base) {
var lookup = info;
if (mod.indexOf('.') < 0) {
lookup = (lookup || {})[mod];
} else {
var parts = mod.split('.');
lookup = (lookup || {})[parts[0]];
lookup = (lookup || {})[parts[1]];
}
if (base) {
lookup = (lookup || {})[base];
}
if (lookup === undefined) {
abort('bad lookupImport to (' + mod + ').' + base);
}
return lookup;
}
function mergeMemory(newBuffer) {
// The wasm instance creates its memory. But static init code might have written to
// buffer already, including the mem init file, and we must copy it over in a proper merge.
// TODO: avoid this copy, by avoiding such static init writes
// TODO: in shorter term, just copy up to the last static init write
var oldBuffer = Module['buffer'];
if (newBuffer.byteLength < oldBuffer.byteLength) {
Module['printErr']('the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here');
}
var oldView = new Int8Array(oldBuffer);
var newView = new Int8Array(newBuffer);
// If we have a mem init file, do not trample it
if (!memoryInitializer) {
oldView.set(newView.subarray(Module['STATIC_BASE'], Module['STATIC_BASE'] + Module['STATIC_BUMP']), Module['STATIC_BASE']);
}
newView.set(oldView);
updateGlobalBuffer(newBuffer);
updateGlobalBufferViews();
}
var WasmTypes = {
none: 0,
i32: 1,
i64: 2,
f32: 3,
f64: 4
};
function fixImports(imports) {
if (!0) return imports;
var ret = {};
for (var i in imports) {
var fixed = i;
if (fixed[0] == '_') fixed = fixed.substr(1);
ret[fixed] = imports[i];
}
return ret;
}
function getBinary() {
var binary;
if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
binary = Module['wasmBinary'];
assert(binary, "on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)");
binary = new Uint8Array(binary);
} else {
binary = Module['readBinary'](wasmBinaryFile);
}
return binary;
}
// do-method functions
function doJustAsm(global, env, providedBuffer) {
// if no Module.asm, or it's the method handler helper (see below), then apply
// the asmjs
if (typeof Module['asm'] !== 'function' || Module['asm'] === methodHandler) {
if (!Module['asmPreload']) {
// you can load the .asm.js file before this, to avoid this sync xhr and eval
eval(Module['read'](asmjsCodeFile)); // set Module.asm
} else {
Module['asm'] = Module['asmPreload'];
}
}
if (typeof Module['asm'] !== 'function') {
Module['printErr']('asm evalling did not set the module properly');
return false;
}
return Module['asm'](global, env, providedBuffer);
}
function doNativeWasm(global, env, providedBuffer) {
if (typeof WebAssembly !== 'object') {
Module['printErr']('no native wasm support detected');
return false;
}
// prepare memory import
if (!(Module['wasmMemory'] instanceof WebAssembly.Memory)) {
Module['printErr']('no native wasm Memory in use');
return false;
}
env['memory'] = Module['wasmMemory'];
// Load the wasm module and create an instance of using native support in the JS engine.
info['global'] = {
'NaN': NaN,
'Infinity': Infinity
};
info['global.Math'] = global.Math;
info['env'] = env;
// handle a generated wasm instance, receiving its exports and
// performing other necessary setup
function receiveInstance(instance) {
exports = instance.exports;
if (exports.memory) mergeMemory(exports.memory);
Module["usingWasm"] = true;
}
Module['printErr']('asynchronously preparing wasm');
addRunDependency('wasm-instantiate'); // we can't run yet
WebAssembly.instantiate(getBinary(), info).then(function(output) {
receiveInstance(output.instance);
Module['asm'] = exports; // swap in the exports so they can be called
Runtime.stackAlloc = exports['stackAlloc'];
Runtime.stackSave = exports['stackSave'];
Runtime.stackRestore = exports['stackRestore'];
Runtime.establishStackSpace = exports['establishStackSpace'];
Runtime.setTempRet0 = exports['setTempRet0'];
Runtime.getTempRet0 = exports['getTempRet0'];
removeRunDependency('wasm-instantiate');
});
return {}; // no exports yet; we'll fill them in later
var instance;
try {
instance = new WebAssembly.Instance(new WebAssembly.Module(getBinary()), info)
} catch (e) {
Module['printErr']('failed to compile wasm module: ' + e);
if (e.toString().indexOf('imported Memory with incompatible size') >= 0) {
Module['printErr']('Memory size incompatibility issues may be due to changing TOTAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set TOTAL_MEMORY at runtime to something smaller than it was at compile time).');
}
return false;
}
receiveInstance(instance);
return exports;
}
function doWasmPolyfill(global, env, providedBuffer, method) {
if (typeof WasmJS !== 'function') {
Module['printErr']('WasmJS not detected - polyfill not bundled?');
return false;
}
// Use wasm.js to polyfill and execute code in a wasm interpreter.
var wasmJS = WasmJS({});
// XXX don't be confused. Module here is in the outside program. wasmJS is the inner wasm-js.cpp.
wasmJS['outside'] = Module; // Inside wasm-js.cpp, Module['outside'] reaches the outside module.
// Information for the instance of the module.
wasmJS['info'] = info;
wasmJS['lookupImport'] = lookupImport;
assert(providedBuffer === Module['buffer']); // we should not even need to pass it as a 3rd arg for wasm, but that's the asm.js way.
info.global = global;
info.env = env;
// polyfill interpreter expects an ArrayBuffer
assert(providedBuffer === Module['buffer']);
env['memory'] = providedBuffer;
assert(env['memory'] instanceof ArrayBuffer);
wasmJS['providedTotalMemory'] = Module['buffer'].byteLength;
// Prepare to generate wasm, using either asm2wasm or s-exprs
var code;
if (method === 'interpret-binary') {
code = getBinary();
} else {
code = Module['read'](method == 'interpret-asm2wasm' ? asmjsCodeFile : wasmTextFile);
}
var temp;
if (method == 'interpret-asm2wasm') {
temp = wasmJS['_malloc'](code.length + 1);
wasmJS['writeAsciiToMemory'](code, temp);
wasmJS['_load_asm2wasm'](temp);
} else if (method === 'interpret-s-expr') {
temp = wasmJS['_malloc'](code.length + 1);
wasmJS['writeAsciiToMemory'](code, temp);
wasmJS['_load_s_expr2wasm'](temp);
} else if (method === 'interpret-binary') {
temp = wasmJS['_malloc'](code.length);
wasmJS['HEAPU8'].set(code, temp);
wasmJS['_load_binary2wasm'](temp, code.length);
} else {
throw 'what? ' + method;
}
wasmJS['_free'](temp);
wasmJS['_instantiate'](temp);
if (Module['newBuffer']) {
mergeMemory(Module['newBuffer']);
Module['newBuffer'] = null;
}
exports = wasmJS['asmExports'];
return exports;
}
// We may have a preloaded value in Module.asm, save it
Module['asmPreload'] = Module['asm'];
// Memory growth integration code
Module['reallocBuffer'] = function(size) {
size = Math.ceil(size / wasmPageSize) * wasmPageSize; // round up to wasm page size
var old = Module['buffer'];
var result = exports['__growWasmMemory'](size / wasmPageSize); // tiny wasm method that just does grow_memory
if (Module["usingWasm"]) {
if (result !== (-1 | 0)) {
// success in native wasm memory growth, get the buffer from the memory
return Module['buffer'] = Module['wasmMemory'].buffer;
} else {
return null;
}
} else {
// in interpreter, we replace Module.buffer if we allocate
return Module['buffer'] !== old ? Module['buffer'] : null; // if it was reallocated, it changed
}
};
// Provide an "asm.js function" for the application, called to "link" the asm.js module. We instantiate
// the wasm module at that time, and it receives imports and provides exports and so forth, the app
// doesn't need to care that it is wasm or olyfilled wasm or asm.js.
Module['asm'] = function(global, env, providedBuffer) {
global = fixImports(global);
env = fixImports(env);
// import table
if (!env['table']) {
var TABLE_SIZE = Module['wasmTableSize'];
if (TABLE_SIZE === undefined) TABLE_SIZE = 1024; // works in binaryen interpreter at least
var MAX_TABLE_SIZE = Module['wasmMaxTableSize'];
if (typeof WebAssembly === 'object' && typeof WebAssembly.Table === 'function') {
if (MAX_TABLE_SIZE !== undefined) {
env['table'] = new WebAssembly.Table({ initial: TABLE_SIZE, maximum: MAX_TABLE_SIZE, element: 'anyfunc' });
} else {
env['table'] = new WebAssembly.Table({ initial: TABLE_SIZE, element: 'anyfunc' });
}
} else {
env['table'] = new Array(TABLE_SIZE); // works in binaryen interpreter at least
}
Module['wasmTable'] = env['table'];
}
if (!env['memoryBase']) {
env['memoryBase'] = Module['STATIC_BASE']; // tell the memory segments where to place themselves
}
if (!env['tableBase']) {
env['tableBase'] = 0; // table starts at 0 by default, in dynamic linking this will change
}
// try the methods. each should return the exports if it succeeded
var exports;
var methods = method.split(',');
for (var i = 0; i < methods.length; i++) {
var curr = methods[i];
Module['printErr']('trying binaryen method: ' + curr);
if (curr === 'native-wasm') {
if (exports = doNativeWasm(global, env, providedBuffer)) break;
} else if (curr === 'asmjs') {
if (exports = doJustAsm(global, env, providedBuffer)) break;
} else if (curr === 'interpret-asm2wasm' || curr === 'interpret-s-expr' || curr === 'interpret-binary') {
if (exports = doWasmPolyfill(global, env, providedBuffer, curr)) break;
} else {
throw 'bad method: ' + curr;
}
}
if (!exports) throw 'no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods';
Module['printErr']('binaryen method succeeded.');
return exports;
};
var methodHandler = Module['asm']; // note our method handler, as we may modify Module['asm'] later
}
Module["demangle"] = demangle || (function (symbol) {return symbol});
var MediaDevices = [];
Module['preRun'].push(function ()
{
var enumerateMediaDevices = function ()
{
var getMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia;
if (!getMedia)
return;
function addDevice(label)
{
label = label ? label : ("device #" + MediaDevices.length);
var device =
{
deviceName: label,
refCount: 0,
video: null
};
MediaDevices.push(device);
}
// try MediaDevices.enumerateDevices, if available
if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices)
{
if (typeof MediaStreamTrack == 'undefined' ||
typeof MediaStreamTrack.getSources == 'undefined')
{
console.log("Media Devices cannot be enumerated on this browser.");
return;
}
function gotSources(sourceInfos)
{
for (var i = 0; i !== sourceInfos.length; ++i)
{
var sourceInfo = sourceInfos[i];
if (sourceInfo.kind === 'video')
addDevice(sourceInfo.label);
}
}
// MediaStreamTrack.getSources asynchronously returns a list of objects that identify devices
// and for privacy purposes the .label properties are not filled in unless the user has consented to
// device access through getUserMedia.
MediaStreamTrack.getSources(gotSources);
}
// List cameras and microphones.
navigator.mediaDevices.enumerateDevices().then(function(devices)
{
devices.forEach(function(device)
{
// device: kind, label, deviceId
if (device.kind == 'videoinput')
addDevice(device.label);
});
})
.catch(function(err)
{
console.log(err.name + ": " + error.message);
});
};
enumerateMediaDevices();
});
function SendMessage(gameObject, func, param)
{
if (param === undefined)
Module.ccall("SendMessage", null, ["string", "string"], [gameObject, func]);
else if (typeof param === "string")
Module.ccall("SendMessageString", null, ["string", "string", "string"], [gameObject, func, param]);
else if (typeof param === "number")
Module.ccall("SendMessageFloat", null, ["string", "string", "number"], [gameObject, func, param]);
else
throw "" + param + " is does not have a type which is supported by SendMessage.";
}
Module["SendMessage"] = SendMessage; // to avoid emscripten stripping
var ___cxa_throw = (function() {
var original___cxa_throw = ___cxa_throw;
return function() {
console.log("Exception at: \n"+stackTrace());
original___cxa_throw();
}
})();
// The Module object: Our interface to the outside world. We import
// and export values on it, and do the work to get that through
// closure compiler if necessary. There are various ways Module can be used:
// 1. Not defined. We create it here
// 2. A function parameter, function(Module) { ..generated code.. }
// 3. pre-run appended it, var Module = {}; ..generated code..
// 4. External script tag defines var Module.
// We need to do an eval in order to handle the closure compiler
// case, where this code here is minified but Module was defined
// elsewhere (e.g. case 4 above). We also need to check if Module
// already exists (e.g. case 3 above).
// Note that if you want to run closure, and also to use Module
// after the generated code, you will need to define var Module = {};
// before the code. Then that object will be used in the code, and you
// can continue to use Module afterwards as well.
var Module;
if (!Module) Module = (typeof Module !== 'undefined' ? Module : null) || {};
// Sometimes an existing Module object exists with properties
// meant to overwrite the default module functionality. Here
// we collect those properties and reapply _after_ we configure
// the current environment's defaults to avoid having to be so
// defensive during initialization.
var moduleOverrides = {};
for (var key in Module) {
if (Module.hasOwnProperty(key)) {
moduleOverrides[key] = Module[key];
}
}
// The environment setup code below is customized to use Module.
// *** Environment setup code ***
var ENVIRONMENT_IS_WEB = false;
var ENVIRONMENT_IS_WORKER = false;
var ENVIRONMENT_IS_NODE = false;
var ENVIRONMENT_IS_SHELL = false;
// Three configurations we can be running in:
// 1) We could be the application main() thread running in the main JS UI thread. (ENVIRONMENT_IS_WORKER == false and ENVIRONMENT_IS_PTHREAD == false)
// 2) We could be the application main() thread proxied to worker. (with Emscripten -s PROXY_TO_WORKER=1) (ENVIRONMENT_IS_WORKER == true, ENVIRONMENT_IS_PTHREAD == false)
// 3) We could be an application pthread running in a worker. (ENVIRONMENT_IS_WORKER == true and ENVIRONMENT_IS_PTHREAD == true)
if (Module['ENVIRONMENT']) {
if (Module['ENVIRONMENT'] === 'WEB') {
ENVIRONMENT_IS_WEB = true;
} else if (Module['ENVIRONMENT'] === 'WORKER') {
ENVIRONMENT_IS_WORKER = true;
} else if (Module['ENVIRONMENT'] === 'NODE') {
ENVIRONMENT_IS_NODE = true;
} else if (Module['ENVIRONMENT'] === 'SHELL') {
ENVIRONMENT_IS_SHELL = true;
} else {
throw new Error('The provided Module[\'ENVIRONMENT\'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.');
}
} else {
ENVIRONMENT_IS_WEB = typeof window === 'object';
ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function' && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER;
ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
}
if (ENVIRONMENT_IS_NODE) {
// Expose functionality in the same simple way that the shells work
// Note that we pollute the global namespace here, otherwise we break in node
if (!Module['print']) Module['print'] = console.log;
if (!Module['printErr']) Module['printErr'] = console.warn;
var nodeFS;
var nodePath;
Module['read'] = function read(filename, binary) {
if (!nodeFS) nodeFS = require('fs');
if (!nodePath) nodePath = require('path');
filename = nodePath['normalize'](filename);
var ret = nodeFS['readFileSync'](filename);
return binary ? ret : ret.toString();
};
Module['readBinary'] = function readBinary(filename) {
var ret = Module['read'](filename, true);
if (!ret.buffer) {
ret = new Uint8Array(ret);
}
assert(ret.buffer);
return ret;
};
Module['load'] = function load(f) {
globalEval(read(f));
};
if (!Module['thisProgram']) {
if (process['argv'].length > 1) {
Module['thisProgram'] = process['argv'][1].replace(/\\/g, '/');
} else {
Module['thisProgram'] = 'unknown-program';
}
}
Module['arguments'] = process['argv'].slice(2);
if (typeof module !== 'undefined') {
module['exports'] = Module;
}
process['on']('uncaughtException', function(ex) {
// suppress ExitStatus exceptions from showing an error
if (!(ex instanceof ExitStatus)) {
throw ex;
}
});
Module['inspect'] = function () { return '[Emscripten Module object]'; };
}
else if (ENVIRONMENT_IS_SHELL) {
if (!Module['print']) Module['print'] = print;
if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm
if (typeof read != 'undefined') {
Module['read'] = read;
} else {
Module['read'] = function read() { throw 'no read() available' };
}
Module['readBinary'] = function readBinary(f) {
if (typeof readbuffer === 'function') {
return new Uint8Array(readbuffer(f));
}
var data = read(f, 'binary');
assert(typeof data === 'object');
return data;
};
if (typeof scriptArgs != 'undefined') {
Module['arguments'] = scriptArgs;
} else if (typeof arguments != 'undefined') {
Module['arguments'] = arguments;
}
}
else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
Module['read'] = function read(url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.send(null);
return xhr.responseText;
};
Module['readAsync'] = function readAsync(url, onload, onerror) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'arraybuffer';
xhr.onload = function xhr_onload() {
if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
onload(xhr.response);
} else {
onerror();
}
};
xhr.onerror = onerror;
xhr.send(null);
};
if (typeof arguments != 'undefined') {
Module['arguments'] = arguments;
}
if (typeof console !== 'undefined') {
if (!Module['print']) Module['print'] = function print(x) {
console.log(x);
};
if (!Module['printErr']) Module['printErr'] = function printErr(x) {
console.warn(x);
};
} else {
// Probably a worker, and without console.log. We can do very little here...
var TRY_USE_DUMP = false;
if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) {
dump(x);
}) : (function(x) {
// self.postMessage(x); // enable this if you want stdout to be sent as messages
}));
}
if (ENVIRONMENT_IS_WORKER) {
Module['load'] = importScripts;
}
if (typeof Module['setWindowTitle'] === 'undefined') {
Module['setWindowTitle'] = function(title) { document.title = title };
}
}
else {
// Unreachable because SHELL is dependant on the others
throw 'Unknown runtime environment. Where are we?';
}
function globalEval(x) {
eval.call(null, x);
}
if (!Module['load'] && Module['read']) {
Module['load'] = function load(f) {
globalEval(Module['read'](f));
};
}
if (!Module['print']) {
Module['print'] = function(){};
}
if (!Module['printErr']) {
Module['printErr'] = Module['print'];
}
if (!Module['arguments']) {
Module['arguments'] = [];
}
if (!Module['thisProgram']) {
Module['thisProgram'] = './this.program';
}
// *** Environment setup code ***
// Closure helpers
Module.print = Module['print'];
Module.printErr = Module['printErr'];
// Callbacks
Module['preRun'] = [];
Module['postRun'] = [];
// Merge back in the overrides
for (var key in moduleOverrides) {
if (moduleOverrides.hasOwnProperty(key)) {
Module[key] = moduleOverrides[key];
}
}
// Free the object hierarchy contained in the overrides, this lets the GC
// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array.
moduleOverrides = undefined;
// {{PREAMBLE_ADDITIONS}}
// === Preamble library stuff ===
// Documentation for the public APIs defined in this file must be updated in:
// site/source/docs/api_reference/preamble.js.rst
// A prebuilt local version of the documentation is available at:
// site/build/text/docs/api_reference/preamble.js.txt
// You can also build docs locally as HTML or other formats in site/
// An online HTML version (which may be of a different version of Emscripten)
// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html
//========================================
// Runtime code shared with compiler
//========================================
var Runtime = {
setTempRet0: function (value) {
tempRet0 = value;
},
getTempRet0: function () {
return tempRet0;
},
stackSave: function () {
return STACKTOP;
},
stackRestore: function (stackTop) {
STACKTOP = stackTop;
},
getNativeTypeSize: function (type) {
switch (type) {
case 'i1': case 'i8': return 1;
case 'i16': return 2;
case 'i32': return 4;
case 'i64': return 8;
case 'float': return 4;
case 'double': return 8;
default: {
if (type[type.length-1] === '*') {
return Runtime.QUANTUM_SIZE; // A pointer
} else if (type[0] === 'i') {
var bits = parseInt(type.substr(1));
assert(bits % 8 === 0);
return bits/8;
} else {
return 0;
}
}
}
},
getNativeFieldSize: function (type) {
return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);
},
STACK_ALIGN: 16,
prepVararg: function (ptr, type) {
if (type === 'double' || type === 'i64') {
// move so the load is aligned
if (ptr & 7) {
assert((ptr & 7) === 4);
ptr += 4;
}
} else {
assert((ptr & 3) === 0);
}
return ptr;
},
getAlignSize: function (type, size, vararg) {
// we align i64s and doubles on 64-bit boundaries, unlike x86
if (!vararg && (type == 'i64' || type == 'double')) return 8;
if (!type) return Math.min(size, 8); // align structures internally to 64 bits
return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);
},
dynCall: function (sig, ptr, args) {
if (args && args.length) {
return Module['dynCall_' + sig].apply(null, [ptr].concat(args));
} else {
return Module['dynCall_' + sig].call(null, ptr);
}
},
functionPointers: [],
addFunction: function (func) {
for (var i = 0; i < Runtime.functionPointers.length; i++) {
if (!Runtime.functionPointers[i]) {
Runtime.functionPointers[i] = func;
return 2*(1 + i);
}
}
throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';
},
removeFunction: function (index) {
Runtime.functionPointers[(index-2)/2] = null;
},
warnOnce: function (text) {
if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};
if (!Runtime.warnOnce.shown[text]) {
Runtime.warnOnce.shown[text] = 1;
Module.printErr(text);
}
},
funcWrappers: {},
getFuncWrapper: function (func, sig) {
assert(sig);
if (!Runtime.funcWrappers[sig]) {
Runtime.funcWrappers[sig] = {};
}
var sigCache = Runtime.funcWrappers[sig];
if (!sigCache[func]) {
// optimize away arguments usage in common cases
if (sig.length === 1) {
sigCache[func] = function dynCall_wrapper() {
return Runtime.dynCall(sig, func);
};
} else if (sig.length === 2) {
sigCache[func] = function dynCall_wrapper(arg) {
return Runtime.dynCall(sig, func, [arg]);
};
} else {
// general case
sigCache[func] = function dynCall_wrapper() {
return Runtime.dynCall(sig, func, Array.prototype.slice.call(arguments));
};
}
}
return sigCache[func];
},
getCompilerSetting: function (name) {
throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work';
},
stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+15)&-16); return ret; },
staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+15)&-16); return ret; },
dynamicAlloc: function (size) { var ret = HEAP32[DYNAMICTOP_PTR>>2];var end = (((ret + size + 15)|0) & -16);HEAP32[DYNAMICTOP_PTR>>2] = end;if (end >= TOTAL_MEMORY) {var success = enlargeMemory();if (!success) {HEAP32[DYNAMICTOP_PTR>>2] = ret;return 0;}}return ret;},
alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 16))*(quantum ? quantum : 16); return ret; },
makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*4294967296.0)) : ((+((low>>>0)))+((+((high|0)))*4294967296.0))); return ret; },
GLOBAL_BASE: 1024,
QUANTUM_SIZE: 4,
__dummy__: 0
}
Module["Runtime"] = Runtime;
//========================================
// Runtime essentials
//========================================
var ABORT = 0; // whether we are quitting the application. no code should run after this. set in exit() and abort()
var EXITSTATUS = 0;
function assert(condition, text) {
if (!condition) {
abort('Assertion failed: ' + text);
}
}
var globalScope = this;
// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
function getCFunc(ident) {
var func = Module['_' + ident]; // closure exported function
if (!func) {
try { func = eval('_' + ident); } catch(e) {}
}
assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');
return func;
}
var cwrap, ccall;
(function(){
var JSfuncs = {
// Helpers for cwrap -- it can't refer to Runtime directly because it might
// be renamed by closure, instead it calls JSfuncs['stackSave'].body to find
// out what the minified function name is.
'stackSave': function() {
Runtime.stackSave()
},
'stackRestore': function() {
Runtime.stackRestore()
},
// type conversion from js to c
'arrayToC' : function(arr) {
var ret = Runtime.stackAlloc(arr.length);
writeArrayToMemory(arr, ret);
return ret;
},
'stringToC' : function(str) {
var ret = 0;
if (str !== null && str !== undefined && str !== 0) { // null string
// at most 4 bytes per UTF-8 code point, +1 for the trailing '\0'
var len = (str.length << 2) + 1;
ret = Runtime.stackAlloc(len);
stringToUTF8(str, ret, len);
}
return ret;
}
};
// For fast lookup of conversion functions
var toC = {'string' : JSfuncs['stringToC'], 'array' : JSfuncs['arrayToC']};
// C calling interface.
ccall = function ccallFunc(ident, returnType, argTypes, args, opts) {
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 = Runtime.stackSave();
cArgs[i] = converter(args[i]);
} else {
cArgs[i] = args[i];
}
}
}
var ret = func.apply(null, cArgs);
if (returnType === 'string') ret = Pointer_stringify(ret);
if (stack !== 0) {
if (opts && opts.async) {
EmterpreterAsync.asyncFinalizers.push(function() {
Runtime.stackRestore(stack);
});
return;
}
Runtime.stackRestore(stack);
}
return ret;
}
var sourceRegex = /^function\s*[a-zA-Z$_0-9]*\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/;
function parseJSFunc(jsfunc) {
// Match the body and the return value of a javascript function source
var parsed = jsfunc.toString().match(sourceRegex).slice(1);
return {arguments : parsed[0], body : parsed[1], returnValue: parsed[2]}
}
// sources of useful functions. we create this lazily as it can trigger a source decompression on this entire file
var JSsource = null;
function ensureJSsource() {
if (!JSsource) {
JSsource = {};
for (var fun in JSfuncs) {
if (JSfuncs.hasOwnProperty(fun)) {
// Elements of toCsource are arrays of three items:
// the code, and the return value
JSsource[fun] = parseJSFunc(JSfuncs[fun]);
}
}
}
}
cwrap = function cwrap(ident, returnType, argTypes) {
argTypes = argTypes || [];
var cfunc = getCFunc(ident);
// When the function takes numbers and returns a number, we can just return
// the original function
var numericArgs = argTypes.every(function(type){ return type === 'number'});
var numericRet = (returnType !== 'string');
if ( numericRet && numericArgs) {
return cfunc;
}
// Creation of the arguments list (["$1","$2",...,"$nargs"])
var argNames = argTypes.map(function(x,i){return '$'+i});
var funcstr = "(function(" + argNames.join(',') + ") {";
var nargs = argTypes.length;
if (!numericArgs) {
// Generate the code needed to convert the arguments from javascript
// values to pointers
ensureJSsource();
funcstr += 'var stack = ' + JSsource['stackSave'].body + ';';
for (var i = 0; i < nargs; i++) {
var arg = argNames[i], type = argTypes[i];
if (type === 'number') continue;
var convertCode = JSsource[type + 'ToC']; // [code, return]
funcstr += 'var ' + convertCode.arguments + ' = ' + arg + ';';
funcstr += convertCode.body + ';';
funcstr += arg + '=(' + convertCode.returnValue + ');';
}
}
// When the code is compressed, the name of cfunc is not literally 'cfunc' anymore
var cfuncname = parseJSFunc(function(){return cfunc}).returnValue;
// Call the function
funcstr += 'var ret = ' + cfuncname + '(' + argNames.join(',') + ');';
if (!numericRet) { // Return type can only by 'string' or 'number'
// Convert the result to a string
var strgfy = parseJSFunc(function(){return Pointer_stringify}).returnValue;
funcstr += 'ret = ' + strgfy + '(ret);';
}
if (!numericArgs) {
// If we had a stack, restore it
ensureJSsource();
funcstr += JSsource['stackRestore'].body.replace('()', '(stack)') + ';';
}
funcstr += 'return ret})';
return eval(funcstr);
};
})();
Module["ccall"] = ccall;
Module["cwrap"] = cwrap;
function setValue(ptr, value, type, noSafe) {
type = type || 'i8';
if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
switch(type) {
case 'i1': HEAP8[((ptr)>>0)]=value; break;
case 'i8': HEAP8[((ptr)>>0)]=value; break;
case 'i16': HEAP16[((ptr)>>1)]=value; break;
case 'i32': HEAP32[((ptr)>>2)]=value; break;
case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break;
case 'float': HEAPF32[((ptr)>>2)]=value; break;
case 'double': HEAPF64[((ptr)>>3)]=value; break;
default: abort('invalid type for setValue: ' + type);
}
}
Module["setValue"] = setValue;
function getValue(ptr, type, noSafe) {
type = type || 'i8';
if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
switch(type) {
case 'i1': return HEAP8[((ptr)>>0)];
case 'i8': return HEAP8[((ptr)>>0)];
case 'i16': return HEAP16[((ptr)>>1)];
case 'i32': return HEAP32[((ptr)>>2)];
case 'i64': return HEAP32[((ptr)>>2)];
case 'float': return HEAPF32[((ptr)>>2)];
case 'double': return HEAPF64[((ptr)>>3)];
default: abort('invalid type for setValue: ' + type);
}
return null;
}
Module["getValue"] = getValue;
var ALLOC_NORMAL = 0; // Tries to use _malloc()
var ALLOC_STACK = 1; // Lives for the duration of the current function call
var ALLOC_STATIC = 2; // Cannot be freed
var ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk
var ALLOC_NONE = 4; // Do not allocate
Module["ALLOC_NORMAL"] = ALLOC_NORMAL;
Module["ALLOC_STACK"] = ALLOC_STACK;
Module["ALLOC_STATIC"] = ALLOC_STATIC;
Module["ALLOC_DYNAMIC"] = ALLOC_DYNAMIC;
Module["ALLOC_NONE"] = ALLOC_NONE;
// allocate(): This is for internal use. You can use it yourself as well, but the interface
// is a little tricky (see docs right below). The reason is that it is optimized
// for multiple syntaxes to save space in generated code. So you should
// normally not use allocate(), and instead allocate memory using _malloc(),
// initialize it with setValue(), and so forth.
// @slab: An array of data, or a number. If a number, then the size of the block to allocate,
// in *bytes* (note that this is sometimes confusing: the next parameter does not
// affect this!)
// @types: Either an array of types, one for each byte (or 0 if no type at that position),
// or a single type which is used for the entire block. This only matters if there
// is initial data - if @slab is a number, then this does not matter at all and is
// ignored.
// @allocator: How to allocate memory, see ALLOC_*
function allocate(slab, types, allocator, ptr) {
var zeroinit, size;
if (typeof slab === 'number') {
zeroinit = true;
size = slab;
} else {
zeroinit = false;
size = slab.length;
}
var singleType = typeof types === 'string' ? types : null;
var ret;
if (allocator == ALLOC_NONE) {
ret = ptr;
} else {
ret = [typeof _malloc === 'function' ? _malloc : Runtime.staticAlloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));
}
if (zeroinit) {
var ptr = ret, stop;
assert((ret & 3) == 0);
stop = ret + (size & ~3);
for (; ptr < stop; ptr += 4) {
HEAP32[((ptr)>>2)]=0;
}
stop = ret + size;
while (ptr < stop) {
HEAP8[((ptr++)>>0)]=0;
}
return ret;
}
if (singleType === 'i8') {
if (slab.subarray || slab.slice) {
HEAPU8.set(slab, ret);
} else {
HEAPU8.set(new Uint8Array(slab), ret);
}
return ret;
}
var i = 0, type, typeSize, previousType;
while (i < size) {
var curr = slab[i];
if (typeof curr === 'function') {
curr = Runtime.getFunctionIndex(curr);
}
type = singleType || types[i];
if (type === 0) {
i++;
continue;
}
if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later
setValue(ret+i, curr, type);
// no need to look up size unless type changes, so cache it
if (previousType !== type) {
typeSize = Runtime.getNativeTypeSize(type);
previousType = type;
}
i += typeSize;
}
return ret;
}
Module["allocate"] = allocate;
// Allocate memory during any stage of startup - static memory early on, dynamic memory later, malloc when ready
function getMemory(size) {
if (!staticSealed) return Runtime.staticAlloc(size);
if (!runtimeInitialized) return Runtime.dynamicAlloc(size);
return _malloc(size);
}
Module["getMemory"] = getMemory;
function Pointer_stringify(ptr, /* optional */ length) {
if (length === 0 || !ptr) return '';
// TODO: use TextDecoder
// Find the length, and check for UTF while doing so
var hasUtf = 0;
var t;
var i = 0;
while (1) {
t = HEAPU8[(((ptr)+(i))>>0)];
hasUtf |= t;
if (t == 0 && !length) break;
i++;
if (length && i == length) break;
}
if (!length) length = i;
var ret = '';
if (hasUtf < 128) {
var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack
var curr;
while (length > 0) {
curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
ret = ret ? ret + curr : curr;
ptr += MAX_CHUNK;
length -= MAX_CHUNK;
}
return ret;
}
return Module['UTF8ToString'](ptr);
}
Module["Pointer_stringify"] = Pointer_stringify;
// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.
function AsciiToString(ptr) {
var str = '';
while (1) {
var ch = HEAP8[((ptr++)>>0)];
if (!ch) return str;
str += String.fromCharCode(ch);
}
}
Module["AsciiToString"] = AsciiToString;
// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP.
function stringToAscii(str, outPtr) {
return writeAsciiToMemory(str, outPtr, false);
}
Module["stringToAscii"] = stringToAscii;
// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns
// a copy of that string as a Javascript String object.
var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined;
function UTF8ArrayToString(u8Array, idx) {
var endPtr = idx;
// TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself.
// Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage.
while (u8Array[endPtr]) ++endPtr;
if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) {
return UTF8Decoder.decode(u8Array.subarray(idx, endPtr));
} else {
var u0, u1, u2, u3, u4, u5;
var str = '';
while (1) {
// For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629
u0 = u8Array[idx++];
if (!u0) return str;
if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; }
u1 = u8Array[idx++] & 63;
if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; }
u2 = u8Array[idx++] & 63;
if ((u0 & 0xF0) == 0xE0) {
u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
} else {
u3 = u8Array[idx++] & 63;
if ((u0 & 0xF8) == 0xF0) {
u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;
} else {
u4 = u8Array[idx++] & 63;
if ((u0 & 0xFC) == 0xF8) {
u0 = ((u0 & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;
} else {
u5 = u8Array[idx++] & 63;
u0 = ((u0 & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;
}
}
}
if (u0 < 0x10000) {
str += String.fromCharCode(u0);
} else {
var ch = u0 - 0x10000;
str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
}
}
}
}
Module["UTF8ArrayToString"] = UTF8ArrayToString;
// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.
function UTF8ToString(ptr) {
return UTF8ArrayToString(HEAPU8,ptr);
}
Module["UTF8ToString"] = UTF8ToString;
// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx',
// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP.
// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write.
// Parameters:
// str: the Javascript string to copy.
// outU8Array: the array to copy to. Each index in this array is assumed to be one 8-byte element.
// outIdx: The starting offset in the array to begin the copying.
// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null
// terminator, i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else.
// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator.
// Returns the number of bytes written, EXCLUDING the null terminator.
function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) {
if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes.
return 0;
var startIdx = outIdx;
var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.
for (var i = 0; i < str.length; ++i) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8.
// See http://unicode.org/faq/utf_bom.html#utf16-3
// For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629
var u = str.charCodeAt(i); // possibly a lead surrogate
if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);
if (u <= 0x7F) {
if (outIdx >= endIdx) break;
outU8Array[outIdx++] = u;
} else if (u <= 0x7FF) {
if (outIdx + 1 >= endIdx) break;
outU8Array[outIdx++] = 0xC0 | (u >> 6);
outU8Array[outIdx++] = 0x80 | (u & 63);
} else if (u <= 0xFFFF) {
if (outIdx + 2 >= endIdx) break;
outU8Array[outIdx++] = 0xE0 | (u >> 12);
outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63);
outU8Array[outIdx++] = 0x80 | (u & 63);
} else if (u <= 0x1FFFFF) {
if (outIdx + 3 >= endIdx) break;
outU8Array[outIdx++] = 0xF0 | (u >> 18);
outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63);
outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63);
outU8Array[outIdx++] = 0x80 | (u & 63);
} else if (u <= 0x3FFFFFF) {
if (outIdx + 4 >= endIdx) break;
outU8Array[outIdx++] = 0xF8 | (u >> 24);
outU8Array[outIdx++] = 0x80 | ((u >> 18) & 63);
outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63);
outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63);
outU8Array[outIdx++] = 0x80 | (u & 63);
} else {
if (outIdx + 5 >= endIdx) break;
outU8Array[outIdx++] = 0xFC | (u >> 30);
outU8Array[outIdx++] = 0x80 | ((u >> 24) & 63);
outU8Array[outIdx++] = 0x80 | ((u >> 18) & 63);
outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63);
outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63);
outU8Array[outIdx++] = 0x80 | (u & 63);
}
}
// Null-terminate the pointer to the buffer.
outU8Array[outIdx] = 0;
return outIdx - startIdx;
}
Module["stringToUTF8Array"] = stringToUTF8Array;
// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP.
// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write.
// Returns the number of bytes written, EXCLUDING the null terminator.
function stringToUTF8(str, outPtr, maxBytesToWrite) {
return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite);
}
Module["stringToUTF8"] = stringToUTF8;
// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte.
function lengthBytesUTF8(str) {
var len = 0;
for (var i = 0; i < str.length; ++i) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8.
// See http://unicode.org/faq/utf_bom.html#utf16-3
var u = str.charCodeAt(i); // possibly a lead surrogate
if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);
if (u <= 0x7F) {
++len;
} else if (u <= 0x7FF) {
len += 2;
} else if (u <= 0xFFFF) {
len += 3;
} else if (u <= 0x1FFFFF) {
len += 4;
} else if (u <= 0x3FFFFFF) {
len += 5;
} else {
len += 6;
}
}
return len;
}
Module["lengthBytesUTF8"] = lengthBytesUTF8;
// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.
var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined;
function UTF16ToString(ptr) {
var endPtr = ptr;
// TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself.
// Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage.
var idx = endPtr >> 1;
while (HEAP16[idx]) ++idx;
endPtr = idx << 1;
if (endPtr - ptr > 32 && UTF16Decoder) {
return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr));
} else {
var i = 0;
var str = '';
while (1) {
var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];
if (codeUnit == 0) return str;
++i;
// fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.
str += String.fromCharCode(codeUnit);
}
}
}
// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP.
// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write.
// Parameters:
// str: the Javascript string to copy.
// outPtr: Byte address in Emscripten HEAP where to write the string to.
// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null
// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else.
// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator.
// Returns the number of bytes written, EXCLUDING the null terminator.
function stringToUTF16(str, outPtr, maxBytesToWrite) {
// Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed.
if (maxBytesToWrite === undefined) {
maxBytesToWrite = 0x7FFFFFFF;
}
if (maxBytesToWrite < 2) return 0;
maxBytesToWrite -= 2; // Null terminator.
var startPtr = outPtr;
var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length;
for (var i = 0; i < numCharsToWrite; ++i) {
// charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.
var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
HEAP16[((outPtr)>>1)]=codeUnit;
outPtr += 2;
}
// Null-terminate the pointer to the HEAP.
HEAP16[((outPtr)>>1)]=0;
return outPtr - startPtr;
}
// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte.
function lengthBytesUTF16(str) {
return str.length*2;
}
function UTF32ToString(ptr) {
var i = 0;
var str = '';
while (1) {
var utf32 = HEAP32[(((ptr)+(i*4))>>2)];
if (utf32 == 0)
return str;
++i;
// Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.
// See http://unicode.org/faq/utf_bom.html#utf16-3
if (utf32 >= 0x10000) {
var ch = utf32 - 0x10000;
str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
} else {
str += String.fromCharCode(utf32);
}
}
}
// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP.
// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write.
// Parameters:
// str: the Javascript string to copy.
// outPtr: Byte address in Emscripten HEAP where to write the string to.
// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null
// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else.
// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator.
// Returns the number of bytes written, EXCLUDING the null terminator.
function stringToUTF32(str, outPtr, maxBytesToWrite) {
// Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed.
if (maxBytesToWrite === undefined) {
maxBytesToWrite = 0x7FFFFFFF;
}
if (maxBytesToWrite < 4) return 0;
var startPtr = outPtr;
var endPtr = startPtr + maxBytesToWrite - 4;
for (var i = 0; i < str.length; ++i) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
// See http://unicode.org/faq/utf_bom.html#utf16-3
var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {
var trailSurrogate = str.charCodeAt(++i);
codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);
}
HEAP32[((outPtr)>>2)]=codeUnit;
outPtr += 4;
if (outPtr + 4 > endPtr) break;
}
// Null-terminate the pointer to the HEAP.
HEAP32[((outPtr)>>2)]=0;
return outPtr - startPtr;
}
// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte.
function lengthBytesUTF32(str) {
var len = 0;
for (var i = 0; i < str.length; ++i) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
// See http://unicode.org/faq/utf_bom.html#utf16-3
var codeUnit = str.charCodeAt(i);
if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate.
len += 4;
}
return len;
}
function demangle(func) {
var __cxa_demangle_func = Module['___cxa_demangle'] || Module['__cxa_demangle'];
if (__cxa_demangle_func) {
try {
var s =
func.substr(1);
var len = lengthBytesUTF8(s)+1;
var buf = _malloc(len);
stringToUTF8(s, buf, len);
var status = _malloc(4);
var ret = __cxa_demangle_func(buf, 0, 0, status);
if (getValue(status, 'i32') === 0 && ret) {
return Pointer_stringify(ret);
}
// otherwise, libcxxabi failed
} catch(e) {
// ignore problems here
} finally {
if (buf) _free(buf);
if (status) _free(status);
if (ret) _free(ret);
}
// failure when using libcxxabi, don't demangle
return func;
}
Runtime.warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling');
return func;
}
function demangleAll(text) {
var regex =
/__Z[\w\d_]+/g;
return text.replace(regex,
function(x) {
var y = demangle(x);
return x === y ? x : (x + ' [' + y + ']');
});
}
function jsStackTrace() {
var err = new Error();
if (!err.stack) {
// IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown,
// so try that as a special-case.
try {
throw new Error(0);
} catch(e) {
err = e;
}
if (!err.stack) {
return '(no stack trace available)';
}
}
return err.stack.toString();
}
function stackTrace() {
var js = jsStackTrace();
if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace']();
return demangleAll(js);
}
Module["stackTrace"] = stackTrace;
// Memory management
var PAGE_SIZE = 4096;
function alignMemoryPage(x) {
if (x % 4096 > 0) {
x += (4096 - (x % 4096));
}
return x;
}
var HEAP;
var buffer;
var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
function updateGlobalBuffer(buf) {
Module['buffer'] = buffer = buf;
}
function updateGlobalBufferViews() {
Module['HEAP8'] = HEAP8 = new Int8Array(buffer);
Module['HEAP16'] = HEAP16 = new Int16Array(buffer);
Module['HEAP32'] = HEAP32 = new Int32Array(buffer);
Module['HEAPU8'] = HEAPU8 = new Uint8Array(buffer);
Module['HEAPU16'] = HEAPU16 = new Uint16Array(buffer);
Module['HEAPU32'] = HEAPU32 = new Uint32Array(buffer);
Module['HEAPF32'] = HEAPF32 = new Float32Array(buffer);
Module['HEAPF64'] = HEAPF64 = new Float64Array(buffer);
}
var STATIC_BASE, STATICTOP, staticSealed; // static area
var STACK_BASE, STACKTOP, STACK_MAX; // stack area
var DYNAMIC_BASE, DYNAMICTOP_PTR; // dynamic area handled by sbrk
STATIC_BASE = STATICTOP = STACK_BASE = STACKTOP = STACK_MAX = DYNAMIC_BASE = DYNAMICTOP_PTR = 0;
staticSealed = false;
function abortOnCannotGrowMemory() {
abort('Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value ' + TOTAL_MEMORY + ', (2) compile with -s ALLOW_MEMORY_GROWTH=1 which adjusts the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ');
}
function enlargeMemory() {
abortOnCannotGrowMemory();
}
var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;
var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 50331648;
var WASM_PAGE_SIZE = 64 * 1024;
var totalMemory = WASM_PAGE_SIZE;
while (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {
if (totalMemory < 16*1024*1024) {
totalMemory *= 2;
} else {
totalMemory += 16*1024*1024;
}
}
if (totalMemory !== TOTAL_MEMORY) {
TOTAL_MEMORY = totalMemory;
}
// Initialize the runtime's memory
// Use a provided buffer, if there is one, or else allocate a new one
if (Module['buffer']) {
buffer = Module['buffer'];
} else {
// Use a WebAssembly memory where available
if (typeof WebAssembly === 'object' && typeof WebAssembly.Memory === 'function') {
Module['wasmMemory'] = new WebAssembly.Memory({ initial: TOTAL_MEMORY / WASM_PAGE_SIZE, maximum: TOTAL_MEMORY / WASM_PAGE_SIZE });
buffer = Module['wasmMemory'].buffer;
} else
{
buffer = new ArrayBuffer(TOTAL_MEMORY);
}
}
updateGlobalBufferViews();
function getTotalMemory() {
return TOTAL_MEMORY;
}
// Endianness check (note: assumes compiler arch was little-endian)
HEAP32[0] = 0x63736d65; /* 'emsc' */
HEAP16[1] = 0x6373;
if (HEAPU8[2] !== 0x73 || HEAPU8[3] !== 0x63) throw 'Runtime error: expected the system to be little-endian!';
Module['HEAP'] = HEAP;
Module['buffer'] = buffer;
Module['HEAP8'] = HEAP8;
Module['HEAP16'] = HEAP16;
Module['HEAP32'] = HEAP32;
Module['HEAPU8'] = HEAPU8;
Module['HEAPU16'] = HEAPU16;
Module['HEAPU32'] = HEAPU32;
Module['HEAPF32'] = HEAPF32;
Module['HEAPF64'] = HEAPF64;
function callRuntimeCallbacks(callbacks) {
while(callbacks.length > 0) {
var callback = callbacks.shift();
if (typeof callback == 'function') {
callback();
continue;
}
var func = callback.func;
if (typeof func === 'number') {
if (callback.arg === undefined) {
Module['dynCall_v'](func);
} else {
Module['dynCall_vi'](func, callback.arg);
}
} else {
func(callback.arg === undefined ? null : callback.arg);
}
}
}
var __ATPRERUN__ = []; // functions called before the runtime is initialized
var __ATINIT__ = []; // functions called during startup
var __ATMAIN__ = []; // functions called when main() is to be run
var __ATEXIT__ = []; // functions called during shutdown
var __ATPOSTRUN__ = []; // functions called after the runtime has exited
var runtimeInitialized = false;
var runtimeExited = false;
function preRun() {
// compatibility - merge in anything from Module['preRun'] at this time
if (Module['preRun']) {
if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
while (Module['preRun'].length) {
addOnPreRun(Module['preRun'].shift());
}
}
callRuntimeCallbacks(__ATPRERUN__);
}
function ensureInitRuntime() {
if (runtimeInitialized) return;
runtimeInitialized = true;
callRuntimeCallbacks(__ATINIT__);
}
function preMain() {
callRuntimeCallbacks(__ATMAIN__);
}
function exitRuntime() {
callRuntimeCallbacks(__ATEXIT__);
runtimeExited = true;
}
function postRun() {
// compatibility - merge in anything from Module['postRun'] at this time
if (Module['postRun']) {
if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
while (Module['postRun'].length) {
addOnPostRun(Module['postRun'].shift());
}
}
callRuntimeCallbacks(__ATPOSTRUN__);
}
function addOnPreRun(cb) {
__ATPRERUN__.unshift(cb);
}
Module["addOnPreRun"] = addOnPreRun;
function addOnInit(cb) {
__ATINIT__.unshift(cb);
}
Module["addOnInit"] = addOnInit;
function addOnPreMain(cb) {
__ATMAIN__.unshift(cb);
}
Module["addOnPreMain"] = addOnPreMain;
function addOnExit(cb) {
__ATEXIT__.unshift(cb);
}
Module["addOnExit"] = addOnExit;
function addOnPostRun(cb) {
__ATPOSTRUN__.unshift(cb);
}
Module["addOnPostRun"] = addOnPostRun;
// Tools
function intArrayFromString(stringy, dontAddNull, length /* optional */) {
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;
}
Module["intArrayFromString"] = intArrayFromString;
function intArrayToString(array) {
var ret = [];
for (var i = 0; i < array.length; i++) {
var chr = array[i];
if (chr > 0xFF) {
chr &= 0xFF;
}
ret.push(String.fromCharCode(chr));
}
return ret.join('');
}
Module["intArrayToString"] = intArrayToString;
// Deprecated: This function should not be called because it is unsafe and does not provide
// a maximum length limit of how many bytes it is allowed to write. Prefer calling the
// function stringToUTF8Array() instead, which takes in a maximum length that can be used
// to be secure from out of bounds writes.
function writeStringToMemory(string, buffer, dontAddNull) {
Runtime.warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!');
var lastChar, end;
if (dontAddNull) {
// stringToUTF8Array always appends null. If we don't want to do that, remember the
// character that existed at the location where the null will be placed, and restore
// that after the write (below).
end = buffer + lengthBytesUTF8(string);
lastChar = HEAP8[end];
}
stringToUTF8(string, buffer, Infinity);
if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character.
}
Module["writeStringToMemory"] = writeStringToMemory;
function writeArrayToMemory(array, buffer) {
HEAP8.set(array, buffer);
}
Module["writeArrayToMemory"] = writeArrayToMemory;
function writeAsciiToMemory(str, buffer, dontAddNull) {
for (var i = 0; i < str.length; ++i) {
HEAP8[((buffer++)>>0)]=str.charCodeAt(i);
}
// Null-terminate the pointer to the HEAP.
if (!dontAddNull) HEAP8[((buffer)>>0)]=0;
}
Module["writeAsciiToMemory"] = writeAsciiToMemory;
function unSign(value, bits, ignore) {
if (value >= 0) {
return value;
}
return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts
: Math.pow(2, bits) + value;
}
function reSign(value, bits, ignore) {
if (value <= 0) {
return value;
}
var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32
: Math.pow(2, bits-1);
if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that
// but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors
// TODO: In i64 mode 1, resign the two parts separately and safely
value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts
}
return value;
}
// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )
if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {
var ah = a >>> 16;
var al = a & 0xffff;
var bh = b >>> 16;
var bl = b & 0xffff;
return (al*bl + ((ah*bl + al*bh) << 16))|0;
};
Math.imul = Math['imul'];
if (!Math['fround']) {
var froundBuffer = new Float32Array(1);
Math['fround'] = function(x) { froundBuffer[0] = x; return froundBuffer[0] };
}
Math.fround = Math['fround'];
if (!Math['clz32']) Math['clz32'] = function(x) {
x = x >>> 0;
for (var i = 0; i < 32; i++) {
if (x & (1 << (31 - i))) return i;
}
return 32;
};
Math.clz32 = Math['clz32']
if (!Math['trunc']) Math['trunc'] = function(x) {
return x < 0 ? Math.ceil(x) : Math.floor(x);
};
Math.trunc = Math['trunc'];
var Math_abs = Math.abs;
var Math_cos = Math.cos;
var Math_sin = Math.sin;
var Math_tan = Math.tan;
var Math_acos = Math.acos;
var Math_asin = Math.asin;
var Math_atan = Math.atan;
var Math_atan2 = Math.atan2;
var Math_exp = Math.exp;
var Math_log = Math.log;
var Math_sqrt = Math.sqrt;
var Math_ceil = Math.ceil;
var Math_floor = Math.floor;
var Math_pow = Math.pow;
var Math_imul = Math.imul;
var Math_fround = Math.fround;
var Math_round = Math.round;
var Math_min = Math.min;
var Math_clz32 = Math.clz32;
var Math_trunc = Math.trunc;
// A counter of dependencies for calling run(). If we need to
// do asynchronous work before running, increment this and
// decrement it. Incrementing must happen in a place like
// PRE_RUN_ADDITIONS (used by emcc to add file preloading).
// Note that you can add dependencies in preRun, even though
// it happens right before run - run will be postponed until
// the dependencies are met.
var runDependencies = 0;
var runDependencyWatcher = null;
var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
function getUniqueRunDependency(id) {
return id;
}
function addRunDependency(id) {
runDependencies++;
if (Module['monitorRunDependencies']) {
Module['monitorRunDependencies'](runDependencies);
}
}
Module["addRunDependency"] = addRunDependency;
function removeRunDependency(id) {
runDependencies--;
if (Module['monitorRunDependencies']) {
Module['monitorRunDependencies'](runDependencies);
}
if (runDependencies == 0) {
if (runDependencyWatcher !== null) {
clearInterval(runDependencyWatcher);
runDependencyWatcher = null;
}
if (dependenciesFulfilled) {
var callback = dependenciesFulfilled;
dependenciesFulfilled = null;
callback(); // can add another dependenciesFulfilled
}
}
}
Module["removeRunDependency"] = removeRunDependency;
Module["preloadedImages"] = {}; // maps url to image data
Module["preloadedAudios"] = {}; // maps url to audio data
var memoryInitializer = null;
function integrateWasmJS(Module) {
// wasm.js has several methods for creating the compiled code module here:
// * 'native-wasm' : use native WebAssembly support in the browser
// * 'interpret-s-expr': load s-expression code from a .wast and interpret
// * 'interpret-binary': load binary wasm and interpret
// * 'interpret-asm2wasm': load asm.js code, translate to wasm, and interpret
// * 'asmjs': no wasm, just load the asm.js code and use that (good for testing)
// The method can be set at compile time (BINARYEN_METHOD), or runtime by setting Module['wasmJSMethod'].
// The method can be a comma-separated list, in which case, we will try the
// options one by one. Some of them can fail gracefully, and then we can try
// the next.
// inputs
var method = Module['wasmJSMethod'] || 'native-wasm';
Module['wasmJSMethod'] = method;
var wasmTextFile = Module['wasmTextFile'] || 'build.wast';
var wasmBinaryFile = Module['wasmBinaryFile'] || 'build.wasm';
var asmjsCodeFile = Module['asmjsCodeFile'] || 'build.asm.js';
// utilities
var wasmPageSize = 64*1024;
var asm2wasmImports = { // special asm2wasm imports
"f64-rem": function(x, y) {
return x % y;
},
"f64-to-int": function(x) {
return x | 0;
},
"i32s-div": function(x, y) {
return ((x | 0) / (y | 0)) | 0;
},
"i32u-div": function(x, y) {
return ((x >>> 0) / (y >>> 0)) >>> 0;
},
"i32s-rem": function(x, y) {
return ((x | 0) % (y | 0)) | 0;
},
"i32u-rem": function(x, y) {
return ((x >>> 0) % (y >>> 0)) >>> 0;
},
"debugger": function() {
debugger;
},
};
var info = {
'global': null,
'env': null,
'asm2wasm': asm2wasmImports,
'parent': Module // Module inside wasm-js.cpp refers to wasm-js.cpp; this allows access to the outside program.
};
var exports = null;
function lookupImport(mod, base) {
var lookup = info;
if (mod.indexOf('.') < 0) {
lookup = (lookup || {})[mod];
} else {
var parts = mod.split('.');
lookup = (lookup || {})[parts[0]];
lookup = (lookup || {})[parts[1]];
}
if (base) {
lookup = (lookup || {})[base];
}
if (lookup === undefined) {
abort('bad lookupImport to (' + mod + ').' + base);
}
return lookup;
}
function mergeMemory(newBuffer) {
// The wasm instance creates its memory. But static init code might have written to
// buffer already, including the mem init file, and we must copy it over in a proper merge.
// TODO: avoid this copy, by avoiding such static init writes
// TODO: in shorter term, just copy up to the last static init write
var oldBuffer = Module['buffer'];
if (newBuffer.byteLength < oldBuffer.byteLength) {
Module['printErr']('the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here');
}
var oldView = new Int8Array(oldBuffer);
var newView = new Int8Array(newBuffer);
// If we have a mem init file, do not trample it
if (!memoryInitializer) {
oldView.set(newView.subarray(Module['STATIC_BASE'], Module['STATIC_BASE'] + Module['STATIC_BUMP']), Module['STATIC_BASE']);
}
newView.set(oldView);
updateGlobalBuffer(newBuffer);
updateGlobalBufferViews();
}
var WasmTypes = {
none: 0,
i32: 1,
i64: 2,
f32: 3,
f64: 4
};
function fixImports(imports) {
if (!0) return imports;
var ret = {};
for (var i in imports) {
var fixed = i;
if (fixed[0] == '_') fixed = fixed.substr(1);
ret[fixed] = imports[i];
}
return ret;
}
function getBinary() {
var binary;
if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
binary = Module['wasmBinary'];
assert(binary, "on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)");
binary = new Uint8Array(binary);
} else {
binary = Module['readBinary'](wasmBinaryFile);
}
return binary;
}
// do-method functions
function doJustAsm(global, env, providedBuffer) {
// if no Module.asm, or it's the method handler helper (see below), then apply
// the asmjs
if (typeof Module['asm'] !== 'function' || Module['asm'] === methodHandler) {
if (!Module['asmPreload']) {
// you can load the .asm.js file before this, to avoid this sync xhr and eval
eval(Module['read'](asmjsCodeFile)); // set Module.asm
} else {
Module['asm'] = Module['asmPreload'];
}
}
if (typeof Module['asm'] !== 'function') {
Module['printErr']('asm evalling did not set the module properly');
return false;
}
return Module['asm'](global, env, providedBuffer);
}
function doNativeWasm(global, env, providedBuffer) {
if (typeof WebAssembly !== 'object') {
Module['printErr']('no native wasm support detected');
return false;
}
// prepare memory import
if (!(Module['wasmMemory'] instanceof WebAssembly.Memory)) {
Module['printErr']('no native wasm Memory in use');
return false;
}
env['memory'] = Module['wasmMemory'];
// Load the wasm module and create an instance of using native support in the JS engine.
info['global'] = {
'NaN': NaN,
'Infinity': Infinity
};
info['global.Math'] = global.Math;
info['env'] = env;
// handle a generated wasm instance, receiving its exports and
// performing other necessary setup
function receiveInstance(instance) {
exports = instance.exports;
if (exports.memory) mergeMemory(exports.memory);
Module["usingWasm"] = true;
}
Module['printErr']('asynchronously preparing wasm');
addRunDependency('wasm-instantiate'); // we can't run yet
WebAssembly.instantiate(getBinary(), info).then(function(output) {
receiveInstance(output.instance);
Module['asm'] = exports; // swap in the exports so they can be called
removeRunDependency('wasm-instantiate');
});
return {}; // no exports yet; we'll fill them in later
var instance;
try {
instance = new WebAssembly.Instance(new WebAssembly.Module(getBinary()), info)
} catch (e) {
Module['printErr']('failed to compile wasm module: ' + e);
if (e.toString().indexOf('imported Memory with incompatible size') >= 0) {
Module['printErr']('Memory size incompatibility issues may be due to changing TOTAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set TOTAL_MEMORY at runtime to something smaller than it was at compile time).');
}
return false;
}
receiveInstance(instance);
return exports;
}
function doWasmPolyfill(global, env, providedBuffer, method) {
if (typeof WasmJS !== 'function') {
Module['printErr']('WasmJS not detected - polyfill not bundled?');
return false;
}
// Use wasm.js to polyfill and execute code in a wasm interpreter.
var wasmJS = WasmJS({});
// XXX don't be confused. Module here is in the outside program. wasmJS is the inner wasm-js.cpp.
wasmJS['outside'] = Module; // Inside wasm-js.cpp, Module['outside'] reaches the outside module.
// Information for the instance of the module.
wasmJS['info'] = info;
wasmJS['lookupImport'] = lookupImport;
assert(providedBuffer === Module['buffer']); // we should not even need to pass it as a 3rd arg for wasm, but that's the asm.js way.
info.global = global;
info.env = env;
// polyfill interpreter expects an ArrayBuffer
assert(providedBuffer === Module['buffer']);
env['memory'] = providedBuffer;
assert(env['memory'] instanceof ArrayBuffer);
wasmJS['providedTotalMemory'] = Module['buffer'].byteLength;
// Prepare to generate wasm, using either asm2wasm or s-exprs
var code;
if (method === 'interpret-binary') {
code = getBinary();
} else {
code = Module['read'](method == 'interpret-asm2wasm' ? asmjsCodeFile : wasmTextFile);
}
var temp;
if (method == 'interpret-asm2wasm') {
temp = wasmJS['_malloc'](code.length + 1);
wasmJS['writeAsciiToMemory'](code, temp);
wasmJS['_load_asm2wasm'](temp);
} else if (method === 'interpret-s-expr') {
temp = wasmJS['_malloc'](code.length + 1);
wasmJS['writeAsciiToMemory'](code, temp);
wasmJS['_load_s_expr2wasm'](temp);
} else if (method === 'interpret-binary') {
temp = wasmJS['_malloc'](code.length);
wasmJS['HEAPU8'].set(code, temp);
wasmJS['_load_binary2wasm'](temp, code.length);
} else {
throw 'what? ' + method;
}
wasmJS['_free'](temp);
wasmJS['_instantiate'](temp);
if (Module['newBuffer']) {
mergeMemory(Module['newBuffer']);
Module['newBuffer'] = null;
}
exports = wasmJS['asmExports'];
return exports;
}
// We may have a preloaded value in Module.asm, save it
Module['asmPreload'] = Module['asm'];
// Memory growth integration code
Module['reallocBuffer'] = function(size) {
size = Math.ceil(size / wasmPageSize) * wasmPageSize; // round up to wasm page size
var old = Module['buffer'];
var result = exports['__growWasmMemory'](size / wasmPageSize); // tiny wasm method that just does grow_memory
if (Module["usingWasm"]) {
if (result !== (-1 | 0)) {
// success in native wasm memory growth, get the buffer from the memory
return Module['buffer'] = Module['wasmMemory'].buffer;
} else {
return null;
}
} else {
// in interpreter, we replace Module.buffer if we allocate
return Module['buffer'] !== old ? Module['buffer'] : null; // if it was reallocated, it changed
}
};
// Provide an "asm.js function" for the application, called to "link" the asm.js module. We instantiate
// the wasm module at that time, and it receives imports and provides exports and so forth, the app
// doesn't need to care that it is wasm or olyfilled wasm or asm.js.
Module['asm'] = function(global, env, providedBuffer) {
global = fixImports(global);
env = fixImports(env);
// import table
if (!env['table']) {
var TABLE_SIZE = Module['wasmTableSize'];
if (TABLE_SIZE === undefined) TABLE_SIZE = 1024; // works in binaryen interpreter at least
var MAX_TABLE_SIZE = Module['wasmMaxTableSize'];
if (typeof WebAssembly === 'object' && typeof WebAssembly.Table === 'function') {
if (MAX_TABLE_SIZE !== undefined) {
env['table'] = new WebAssembly.Table({ initial: TABLE_SIZE, maximum: MAX_TABLE_SIZE, element: 'anyfunc' });
} else {
env['table'] = new WebAssembly.Table({ initial: TABLE_SIZE, element: 'anyfunc' });
}
} else {
env['table'] = new Array(TABLE_SIZE); // works in binaryen interpreter at least
}
Module['wasmTable'] = env['table'];
}
if (!env['memoryBase']) {
env['memoryBase'] = Module['STATIC_BASE']; // tell the memory segments where to place themselves
}
if (!env['tableBase']) {
env['tableBase'] = 0; // table starts at 0 by default, in dynamic linking this will change
}
// try the methods. each should return the exports if it succeeded
var exports;
var methods = method.split(',');
for (var i = 0; i < methods.length; i++) {
var curr = methods[i];
Module['printErr']('trying binaryen method: ' + curr);
if (curr === 'native-wasm') {
if (exports = doNativeWasm(global, env, providedBuffer)) break;
} else if (curr === 'asmjs') {
if (exports = doJustAsm(global, env, providedBuffer)) break;
} else if (curr === 'interpret-asm2wasm' || curr === 'interpret-s-expr' || curr === 'interpret-binary') {
if (exports = doWasmPolyfill(global, env, providedBuffer, curr)) break;
} else {
throw 'bad method: ' + curr;
}
}
if (!exports) throw 'no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods';
Module['printErr']('binaryen method succeeded.');
return exports;
};
var methodHandler = Module['asm']; // note our method handler, as we may modify Module['asm'] later
}
integrateWasmJS(Module);
// === Body ===
var ASM_CONSTS = [function($0, $1) { { Module.printErr('bad name in getProcAddress: ' + [Pointer_stringify($0), Pointer_stringify($1)]); } }];
function _emscripten_asm_const_iii(code, a0, a1) {
return ASM_CONSTS[code](a0, a1);
}
STATIC_BASE = 1024;
STATICTOP = STATIC_BASE + 1764288;
/* global initializers */ __ATINIT__.push({ func: function() { __GLOBAL__sub_I_runtime_animation_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_animation2_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_animation3_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_video_lump_cpp() } }, { func: function() { ___cxx_global_var_init13() } }, { func: function() { __GLOBAL__sub_I_SwCollision_cpp() } }, { func: function() { __GLOBAL__sub_I_SwInterCollision_cpp() } }, { func: function() { __GLOBAL__sub_I_SwSelfCollision_cpp() } }, { func: function() { __GLOBAL__sub_I_SwSolverKernel_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_cloth_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_platformdependent_webgl_source_lump_cpp() } }, { func: function() { ___cxx_global_var_init_2() } }, { func: function() { __GLOBAL__sub_I_runtime_assetbundles_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_baseclasses_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_baseclasses2_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_camera_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_camera2_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_camera3_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_camera4_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_camera_renderlayers_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_camera_renderloops_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_core_callbacks_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_geometry_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_gfxdevice_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_gfxdevice2_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_graphics_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_graphics4_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_graphics5_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_graphics_billboard_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_graphics_lod_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_graphics_mesh_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_graphics_mesh2_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_input_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_interfaces_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_math_random_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_misc_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_preloadmanager_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_scenemanager_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_scripting_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_shaders_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_shaders_shaderimpl_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_terrain_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_transform_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_utilities_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_utilities2_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_utilities3_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_half_cpp() } }, { func: function() { __GLOBAL__sub_I_SpriteRendererJobs_cpp() } }, { func: function() { __GLOBAL__sub_I_Player_cpp() } }, { func: function() { __GLOBAL__sub_I_GlslGpuProgramGLES_cpp() } }, { func: function() { __GLOBAL__sub_I_modules_particleslegacy_private_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_particlesystem_modules2_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_particlesystem_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_physics2d_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_physics2d2_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_PxsFluidDynamics_cpp() } }, { func: function() { __GLOBAL__sub_I_CmEventProfiler_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_dynamics_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_dynamics2_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_terrain_lump_cpp_4457() } }, { func: function() { __GLOBAL__sub_I_runtime_terrain2_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_TextMeshGenerator_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_ui_lump_cpp() } }, { func: function() { __GLOBAL__sub_I_umbra_cpp() } }, { func: function() { __GLOBAL__sub_I_UnityAdsSettings_cpp() } }, { func: function() { __GLOBAL__sub_I_VRGfxHelpers_cpp() } }, { func: function() { __GLOBAL__sub_I_PluginInterfaceVR_cpp() } }, { func: function() { __GLOBAL__sub_I_Class_cpp() } }, { func: function() { __GLOBAL__sub_I_MetadataCache_cpp() } }, { func: function() { __GLOBAL__sub_I_Runtime_cpp() } }, { func: function() { __GLOBAL__sub_I_Reflection_cpp() } }, { func: function() { __GLOBAL__sub_I_File_cpp() } }, { func: function() { __GLOBAL__sub_I_Thread_cpp() } }, { func: function() { __GLOBAL__sub_I_ArrayMetadata_cpp() } }, { func: function() { __GLOBAL__sub_I_Assembly_cpp() } }, { func: function() { __GLOBAL__sub_I_GenericMetadata_cpp() } }, { func: function() { __GLOBAL__sub_I_Socket_cpp() } }, { func: function() { __GLOBAL__sub_I_Image_cpp() } }, { func: function() { __GLOBAL__sub_I_GCHandle_cpp() } }, { func: function() { __GLOBAL__sub_I_RCW_cpp() } }, { func: function() { __GLOBAL__sub_I_StackTrace_cpp() } }, { func: function() { __GLOBAL__sub_I_GarbageCollector_cpp() } }, { func: function() { __GLOBAL__sub_I_AppDomain_cpp() } }, { func: function() { __GLOBAL__sub_I_Console_cpp() } }, { func: function() { __GLOBAL__sub_I_ThreadImpl_cpp() } }, { func: function() { __GLOBAL__sub_I_LibraryLoader_cpp() } }, { func: function() { __GLOBAL__sub_I_Thread_cpp_41934() } }, { func: function() { __GLOBAL__sub_I_GenericMethod_cpp() } }, { func: function() { __GLOBAL__sub_I_Interlocked_cpp() } }, { func: function() { __GLOBAL__sub_I_String_cpp() } }, { func: function() { __GLOBAL__sub_I_Assembly_cpp_42188() } }, { func: function() { __GLOBAL__sub_I_Il2CppCodeRegistration_cpp() } }, { func: function() { __GLOBAL__sub_I_MemoryMappedFile_cpp() } }, { func: function() { __GLOBAL__sub_I_Environment_cpp() } }, { func: function() { __GLOBAL__sub_I_Error_cpp() } });
memoryInitializer = Module["wasmJSMethod"].indexOf("asmjs") >= 0 || Module["wasmJSMethod"].indexOf("interpret-asm2wasm") >= 0 ? "build.js.mem" : null;
var STATIC_BUMP = 1764288;
Module["STATIC_BASE"] = STATIC_BASE;
Module["STATIC_BUMP"] = STATIC_BUMP;
/* no memory initializer */
var tempDoublePtr = STATICTOP; STATICTOP += 16;
function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much
HEAP8[tempDoublePtr] = HEAP8[ptr];
HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
}
function copyTempDouble(ptr) {
HEAP8[tempDoublePtr] = HEAP8[ptr];
HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];
HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];
HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];
HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];
}
// {{PRE_LIBRARY}}
var GL={counter:1,lastError:0,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:[],currentContext:null,offscreenCanvases:{},timerQueriesEXT:[],queries:[],samplers:[],transformFeedbacks:[],syncs:[],byteSizeByTypeRoot:5120,byteSizeByType:[1,1,2,2,4,4,4,2,3,4,8],programInfos:{},stringCache:{},stringiCache:{},packAlignment:4,unpackAlignment:4,init:function () {
GL.miniTempBuffer = new Float32Array(GL.MINI_TEMP_BUFFER_SIZE);
for (var i = 0; i < GL.MINI_TEMP_BUFFER_SIZE; i++) {
GL.miniTempBufferViews[i] = GL.miniTempBuffer.subarray(0, i+1);
}
},recordError:function recordError(errorCode) {
if (!GL.lastError) {
GL.lastError = errorCode;
}
},getNewId:function (table) {
var ret = GL.counter++;
for (var i = table.length; i < ret; i++) {
table[i] = null;
}
return ret;
},MINI_TEMP_BUFFER_SIZE:256,miniTempBuffer:null,miniTempBufferViews:[0],getSource:function (shader, count, string, length) {
var source = '';
for (var i = 0; i < count; ++i) {
var frag;
if (length) {
var len = HEAP32[(((length)+(i*4))>>2)];
if (len < 0) {
frag = Pointer_stringify(HEAP32[(((string)+(i*4))>>2)]);
} else {
frag = Pointer_stringify(HEAP32[(((string)+(i*4))>>2)], len);
}
} else {
frag = Pointer_stringify(HEAP32[(((string)+(i*4))>>2)]);
}
source += frag;
}
return source;
},createContext:function (canvas, webGLContextAttributes) {
if (typeof webGLContextAttributes['majorVersion'] === 'undefined' && typeof webGLContextAttributes['minorVersion'] === 'undefined') {
webGLContextAttributes['majorVersion'] = 2;
webGLContextAttributes['minorVersion'] = 0;
}
var ctx;
var errorInfo = '?';
function onContextCreationError(event) {
errorInfo = event.statusMessage || errorInfo;
}
try {
canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);
try {
if (webGLContextAttributes['majorVersion'] == 1 && webGLContextAttributes['minorVersion'] == 0) {
ctx = canvas.getContext("webgl", webGLContextAttributes) || canvas.getContext("experimental-webgl", webGLContextAttributes);
} else if (webGLContextAttributes['majorVersion'] == 2 && webGLContextAttributes['minorVersion'] == 0) {
ctx = canvas.getContext("webgl2", webGLContextAttributes) || canvas.getContext("experimental-webgl2", webGLContextAttributes);
} else {
throw 'Unsupported WebGL context version ' + majorVersion + '.' + minorVersion + '!'
}
} finally {
canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);
}
if (!ctx) throw ':(';
} catch (e) {
Module.print('Could not create canvas: ' + [errorInfo, e, JSON.stringify(webGLContextAttributes)]);
return 0;
}
// possible GL_DEBUG entry point: ctx = wrapDebugGL(ctx);
if (!ctx) return 0;
return GL.registerContext(ctx, webGLContextAttributes);
},registerContext:function (ctx, webGLContextAttributes) {
var handle = GL.getNewId(GL.contexts);
var context = {
handle: handle,
attributes: webGLContextAttributes,
version: webGLContextAttributes['majorVersion'],
GLctx: ctx
};
// Store the created context object so that we can access the context given a canvas without having to pass the parameters again.
if (ctx.canvas) ctx.canvas.GLctxObject = context;
GL.contexts[handle] = context;
if (typeof webGLContextAttributes['enableExtensionsByDefault'] === 'undefined' || webGLContextAttributes['enableExtensionsByDefault']) {
GL.initExtensions(context);
}
return handle;
},makeContextCurrent:function (contextHandle) {
var context = GL.contexts[contextHandle];
if (!context) return false;
GLctx = Module.ctx = context.GLctx; // Active WebGL context object.
GL.currentContext = context; // Active Emscripten GL layer context object.
return true;
},getContext:function (contextHandle) {
return GL.contexts[contextHandle];
},deleteContext:function (contextHandle) {
if (GL.currentContext === GL.contexts[contextHandle]) GL.currentContext = null;
if (typeof JSEvents === 'object') JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); // Release all JS event handlers on the DOM element that the GL context is associated with since the context is now deleted.
if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) GL.contexts[contextHandle].GLctx.canvas.GLctxObject = undefined; // Make sure the canvas object no longer refers to the context object so there are no GC surprises.
GL.contexts[contextHandle] = null;
},initExtensions:function (context) {
// If this function is called without a specific context object, init the extensions of the currently active context.
if (!context) context = GL.currentContext;
if (context.initExtensionsDone) return;
context.initExtensionsDone = true;
var GLctx = context.GLctx;
context.maxVertexAttribs = GLctx.getParameter(GLctx.MAX_VERTEX_ATTRIBS);
// Detect the presence of a few extensions manually, this GL interop layer itself will need to know if they exist.
if (context.version < 2) {
// Extension available from Firefox 26 and Google Chrome 30
var instancedArraysExt = GLctx.getExtension('ANGLE_instanced_arrays');
if (instancedArraysExt) {
GLctx['vertexAttribDivisor'] = function(index, divisor) { instancedArraysExt['vertexAttribDivisorANGLE'](index, divisor); };
GLctx['drawArraysInstanced'] = function(mode, first, count, primcount) { instancedArraysExt['drawArraysInstancedANGLE'](mode, first, count, primcount); };
GLctx['drawElementsInstanced'] = function(mode, count, type, indices, primcount) { instancedArraysExt['drawElementsInstancedANGLE'](mode, count, type, indices, primcount); };
}
// Extension available from Firefox 25 and WebKit
var vaoExt = GLctx.getExtension('OES_vertex_array_object');
if (vaoExt) {
GLctx['createVertexArray'] = function() { return vaoExt['createVertexArrayOES'](); };
GLctx['deleteVertexArray'] = function(vao) { vaoExt['deleteVertexArrayOES'](vao); };
GLctx['bindVertexArray'] = function(vao) { vaoExt['bindVertexArrayOES'](vao); };
GLctx['isVertexArray'] = function(vao) { return vaoExt['isVertexArrayOES'](vao); };
}
var drawBuffersExt = GLctx.getExtension('WEBGL_draw_buffers');
if (drawBuffersExt) {
GLctx['drawBuffers'] = function(n, bufs) { drawBuffersExt['drawBuffersWEBGL'](n, bufs); };
}
}
GLctx.disjointTimerQueryExt = GLctx.getExtension("EXT_disjoint_timer_query");
// These are the 'safe' feature-enabling extensions that don't add any performance impact related to e.g. debugging, and
// should be enabled by default so that client GLES2/GL code will not need to go through extra hoops to get its stuff working.
// As new extensions are ratified at http://www.khronos.org/registry/webgl/extensions/ , feel free to add your new extensions
// here, as long as they don't produce a performance impact for users that might not be using those extensions.
// E.g. debugging-related extensions should probably be off by default.
var automaticallyEnabledExtensions = [ "OES_texture_float", "OES_texture_half_float", "OES_standard_derivatives",
"OES_vertex_array_object", "WEBGL_compressed_texture_s3tc", "WEBGL_depth_texture",
"OES_element_index_uint", "EXT_texture_filter_anisotropic", "ANGLE_instanced_arrays",
"OES_texture_float_linear", "OES_texture_half_float_linear", "WEBGL_compressed_texture_atc",
"WEBGL_compressed_texture_pvrtc", "EXT_color_buffer_half_float", "WEBGL_color_buffer_float",
"EXT_frag_depth", "EXT_sRGB", "WEBGL_draw_buffers", "WEBGL_shared_resources",
"EXT_shader_texture_lod", "EXT_color_buffer_float"];
function shouldEnableAutomatically(extension) {
var ret = false;
automaticallyEnabledExtensions.forEach(function(include) {
if (ext.indexOf(include) != -1) {
ret = true;
}
});
return ret;
}
var exts = GLctx.getSupportedExtensions();
if (exts && exts.length > 0) {
GLctx.getSupportedExtensions().forEach(function(ext) {
if (automaticallyEnabledExtensions.indexOf(ext) != -1) {
GLctx.getExtension(ext); // Calling .getExtension enables that extension permanently, no need to store the return value to be enabled.
}
});
}
},populateUniformTable:function (program) {
var p = GL.programs[program];
GL.programInfos[program] = {
uniforms: {},
maxUniformLength: 0, // This is eagerly computed below, since we already enumerate all uniforms anyway.
maxAttributeLength: -1, // This is lazily computed and cached, computed when/if first asked, "-1" meaning not computed yet.
maxUniformBlockNameLength: -1 // Lazily computed as well
};
var ptable = GL.programInfos[program];
var utable = ptable.uniforms;
// A program's uniform table maps the string name of an uniform to an integer location of that uniform.
// The global GL.uniforms map maps integer locations to WebGLUniformLocations.
var numUniforms = GLctx.getProgramParameter(p, GLctx.ACTIVE_UNIFORMS);
for (var i = 0; i < numUniforms; ++i) {
var u = GLctx.getActiveUniform(p, i);
var name = u.name;
ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length+1);
// Strip off any trailing array specifier we might have got, e.g. "[0]".
if (name.indexOf(']', name.length-1) !== -1) {
var ls = name.lastIndexOf('[');
name = name.slice(0, ls);
}
// Optimize memory usage slightly: If we have an array of uniforms, e.g. 'vec3 colors[3];', then
// only store the string 'colors' in utable, and 'colors[0]', 'colors[1]' and 'colors[2]' will be parsed as 'colors'+i.
// Note that for the GL.uniforms table, we still need to fetch the all WebGLUniformLocations for all the indices.
var loc = GLctx.getUniformLocation(p, name);
if (loc != null)
{
var id = GL.getNewId(GL.uniforms);
utable[name] = [u.size, id];
GL.uniforms[id] = loc;
for (var j = 1; j < u.size; ++j) {
var n = name + '['+j+']';
loc = GLctx.getUniformLocation(p, n);
id = GL.getNewId(GL.uniforms);
GL.uniforms[id] = loc;
}
}
}
}};function _emscripten_glStencilMaskSeparate(x0, x1) { GLctx['stencilMaskSeparate'](x0, x1) }
function _emscripten_get_now() { abort() }function _emscripten_set_main_loop(func, fps, simulateInfiniteLoop, arg, noSetTiming) {
Module['noExitRuntime'] = true;
assert(!Browser.mainLoop.func, 'emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.');
Browser.mainLoop.func = func;
Browser.mainLoop.arg = arg;
var browserIterationFunc;
if (typeof arg !== 'undefined') {
browserIterationFunc = function() {
Module['dynCall_vi'](func, arg);
};
} else {
browserIterationFunc = function() {
Module['dynCall_v'](func);
};
}
var thisMainLoopId = Browser.mainLoop.currentlyRunningMainloop;
Browser.mainLoop.runner = function Browser_mainLoop_runner() {
if (ABORT) return;
if (Browser.mainLoop.queue.length > 0) {
var start = Date.now();
var blocker = Browser.mainLoop.queue.shift();
blocker.func(blocker.arg);
if (Browser.mainLoop.remainingBlockers) {
var remaining = Browser.mainLoop.remainingBlockers;
var next = remaining%1 == 0 ? remaining-1 : Math.floor(remaining);
if (blocker.counted) {
Browser.mainLoop.remainingBlockers = next;
} else {
// not counted, but move the progress along a tiny bit
next = next + 0.5; // do not steal all the next one's progress
Browser.mainLoop.remainingBlockers = (8*remaining + next)/9;
}
}
console.log('main loop blocker "' + blocker.name + '" took ' + (Date.now() - start) + ' ms'); //, left: ' + Browser.mainLoop.remainingBlockers);
Browser.mainLoop.updateStatus();
// catches pause/resume main loop from blocker execution
if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return;
setTimeout(Browser.mainLoop.runner, 0);
return;
}
// catch pauses from non-main loop sources
if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return;
// Implement very basic swap interval control
Browser.mainLoop.currentFrameNumber = Browser.mainLoop.currentFrameNumber + 1 | 0;
if (Browser.mainLoop.timingMode == 1/*EM_TIMING_RAF*/ && Browser.mainLoop.timingValue > 1 && Browser.mainLoop.currentFrameNumber % Browser.mainLoop.timingValue != 0) {
// Not the scheduled time to render this frame - skip.
Browser.mainLoop.scheduler();
return;
} else if (Browser.mainLoop.timingMode == 0/*EM_TIMING_SETTIMEOUT*/) {
Browser.mainLoop.tickStartTime = _emscripten_get_now();
}
// Signal GL rendering layer that processing of a new frame is about to start. This helps it optimize
// VBO double-buffering and reduce GPU stalls.
if (Browser.mainLoop.method === 'timeout' && Module.ctx) {
Module.printErr('Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!');
Browser.mainLoop.method = ''; // just warn once per call to set main loop
}
Browser.mainLoop.runIter(browserIterationFunc);
// catch pauses from the main loop itself
if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return;
// Queue new audio data. This is important to be right after the main loop invocation, so that we will immediately be able
// to queue the newest produced audio samples.
// TODO: Consider adding pre- and post- rAF callbacks so that GL.newRenderingFrameStarted() and SDL.audio.queueNewAudioData()
// do not need to be hardcoded into this function, but can be more generic.
if (typeof SDL === 'object' && SDL.audio && SDL.audio.queueNewAudioData) SDL.audio.queueNewAudioData();
Browser.mainLoop.scheduler();
}
if (!noSetTiming) {
if (fps && fps > 0) _emscripten_set_main_loop_timing(0/*EM_TIMING_SETTIMEOUT*/, 1000.0 / fps);
else _emscripten_set_main_loop_timing(1/*EM_TIMING_RAF*/, 1); // Do rAF by rendering each frame (no decimating)
Browser.mainLoop.scheduler();
}
if (simulateInfiniteLoop) {
throw 'SimulateInfiniteLoop';
}
}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function () {
Browser.mainLoop.scheduler = null;
Browser.mainLoop.currentlyRunningMainloop++; // Incrementing this signals the previous main loop that it's now become old, and it must return.
},resume:function () {
Browser.mainLoop.currentlyRunningMainloop++;
var timingMode = Browser.mainLoop.timingMode;
var timingValue = Browser.mainLoop.timingValue;
var func = Browser.mainLoop.func;
Browser.mainLoop.func = null;
_emscripten_set_main_loop(func, 0, false, Browser.mainLoop.arg, true /* do not set timing and call scheduler, we will do it on the next lines */);
_emscripten_set_main_loop_timing(timingMode, timingValue);
Browser.mainLoop.scheduler();
},updateStatus:function () {
if (Module['setStatus']) {
var message = Module['statusMessage'] || 'Please wait...';
var remaining = Browser.mainLoop.remainingBlockers;
var expected = Browser.mainLoop.expectedBlockers;
if (remaining) {
if (remaining < expected) {
Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');
} else {
Module['setStatus'](message);
}
} else {
Module['setStatus']('');
}
}
},runIter:function (func) {
if (ABORT) return;
if (Module['preMainLoop']) {
var preRet = Module['preMainLoop']();
if (preRet === false) {
return; // |return false| skips a frame
}
}
try {
func();
} catch (e) {
if (e instanceof ExitStatus) {
return;
} else {
if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);
throw e;
}
}
if (Module['postMainLoop']) Module['postMainLoop']();
}},isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {
if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; // needs to exist even in workers
if (Browser.initted) return;
Browser.initted = true;
try {
new Blob();
Browser.hasBlobConstructor = true;
} catch(e) {
Browser.hasBlobConstructor = false;
console.log("warning: no blob constructor, cannot create blobs with mimetypes");
}
Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null));
Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : undefined;
if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {
console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");
Module.noImageDecoding = true;
}
// Support for plugins that can process preloaded files. You can add more of these to
// your app by creating and appending to Module.preloadPlugins.
//
// Each plugin is asked if it can handle a file based on the file's name. If it can,
// it is given the file's raw data. When it is done, it calls a callback with the file's
// (possibly modified) data. For example, a plugin might decompress a file, or it
// might create some side data structure for use later (like an Image element, etc.).
var imagePlugin = {};
imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {
return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name);
};
imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {
var b = null;
if (Browser.hasBlobConstructor) {
try {
b = new Blob([byteArray], { type: Browser.getMimetype(name) });
if (b.size !== byteArray.length) { // Safari bug #118630
// Safari's Blob can only take an ArrayBuffer
b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });
}
} catch(e) {
Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');
}
}
if (!b) {
var bb = new Browser.BlobBuilder();
bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range
b = bb.getBlob();
}
var url = Browser.URLObject.createObjectURL(b);
var img = new Image();
img.onload = function img_onload() {
assert(img.complete, 'Image ' + name + ' could not be decoded');
var canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
Module["preloadedImages"][name] = canvas;
Browser.URLObject.revokeObjectURL(url);
if (onload) onload(byteArray);
};
img.onerror = function img_onerror(event) {
console.log('Image ' + url + ' could not be decoded');
if (onerror) onerror();
};
img.src = url;
};
Module['preloadPlugins'].push(imagePlugin);
var audioPlugin = {};
audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {
return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };
};
audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {
var done = false;
function finish(audio) {
if (done) return;
done = true;
Module["preloadedAudios"][name] = audio;
if (onload) onload(byteArray);
}
function fail() {
if (done) return;
done = true;
Module["preloadedAudios"][name] = new Audio(); // empty shim
if (onerror) onerror();
}
if (Browser.hasBlobConstructor) {
try {
var b = new Blob([byteArray], { type: Browser.getMimetype(name) });
} catch(e) {
return fail();
}
var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!
var audio = new Audio();
audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926
audio.onerror = function audio_onerror(event) {
if (done) return;
console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');
function encode64(data) {
var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var PAD = '=';
var ret = '';
var leftchar = 0;
var leftbits = 0;
for (var i = 0; i < data.length; i++) {
leftchar = (leftchar << 8) | data[i];
leftbits += 8;
while (leftbits >= 6) {
var curr = (leftchar >> (leftbits-6)) & 0x3f;
leftbits -= 6;
ret += BASE[curr];
}
}
if (leftbits == 2) {
ret += BASE[(leftchar&3) << 4];
ret += PAD + PAD;
} else if (leftbits == 4) {
ret += BASE[(leftchar&0xf) << 2];
ret += PAD;
}
return ret;
}
audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);
finish(audio); // we don't wait for confirmation this worked - but it's worth trying
};
audio.src = url;
// workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror
Browser.safeSetTimeout(function() {
finish(audio); // try to use it even though it is not necessarily ready to play
}, 10000);
} else {
return fail();
}
};
Module['preloadPlugins'].push(audioPlugin);
// Canvas event setup
var canvas = Module['canvas'];
function pointerLockChange() {
Browser.pointerLock = document['pointerLockElement'] === canvas ||
document['mozPointerLockElement'] === canvas ||
document['webkitPointerLockElement'] === canvas ||
document['msPointerLockElement'] === canvas;
}
if (canvas) {
// forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module
// Module['forcedAspectRatio'] = 4 / 3;
canvas.requestPointerLock = canvas['requestPointerLock'] ||
canvas['mozRequestPointerLock'] ||
canvas['webkitRequestPointerLock'] ||
canvas['msRequestPointerLock'] ||
function(){};
canvas.exitPointerLock = document['exitPointerLock'] ||
document['mozExitPointerLock'] ||
document['webkitExitPointerLock'] ||
document['msExitPointerLock'] ||
function(){}; // no-op if function does not exist
canvas.exitPointerLock = canvas.exitPointerLock.bind(document);
document.addEventListener('pointerlockchange', pointerLockChange, false);
document.addEventListener('mozpointerlockchange', pointerLockChange, false);
document.addEventListener('webkitpointerlockchange', pointerLockChange, false);
document.addEventListener('mspointerlockchange', pointerLockChange, false);
if (Module['elementPointerLock']) {
canvas.addEventListener("click", function(ev) {
if (!Browser.pointerLock && canvas.requestPointerLock) {
canvas.requestPointerLock();
ev.preventDefault();
}
}, false);
}
}
},createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {
if (useWebGL && Module.ctx && canvas == Module.canvas) return Module.ctx; // no need to recreate GL context if it's already been created for this canvas.
var ctx;
var contextHandle;
if (useWebGL) {
// For GLES2/desktop GL compatibility, adjust a few defaults to be different to WebGL defaults, so that they align better with the desktop defaults.
var contextAttributes = {
antialias: false,
alpha: false
};
if (webGLContextAttributes) {
for (var attribute in webGLContextAttributes) {
contextAttributes[attribute] = webGLContextAttributes[attribute];
}
}
contextHandle = GL.createContext(canvas, contextAttributes);
if (contextHandle) {
ctx = GL.getContext(contextHandle).GLctx;
}
} else {
ctx = canvas.getContext('2d');
}
if (!ctx) return null;
if (setInModule) {
if (!useWebGL) assert(typeof GLctx === 'undefined', 'cannot set in module if GLctx is used, but we are a non-GL context that would replace it');
Module.ctx = ctx;
if (useWebGL) GL.makeContextCurrent(contextHandle);
Module.useWebGL = useWebGL;
Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });
Browser.init();
}
return ctx;
},destroyContext:function (canvas, useWebGL, setInModule) {},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function (lockPointer, resizeCanvas, vrDevice) {
Browser.lockPointer = lockPointer;
Browser.resizeCanvas = resizeCanvas;
Browser.vrDevice = vrDevice;
if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;
if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;
if (typeof Browser.vrDevice === 'undefined') Browser.vrDevice = null;
var canvas = Module['canvas'];
function fullscreenChange() {
Browser.isFullscreen = false;
var canvasContainer = canvas.parentNode;
if ((document['fullscreenElement'] || document['mozFullScreenElement'] ||
document['msFullscreenElement'] || document['webkitFullscreenElement'] ||
document['webkitCurrentFullScreenElement']) === canvasContainer) {
canvas.exitFullscreen = document['exitFullscreen'] ||
document['cancelFullScreen'] ||
document['mozCancelFullScreen'] ||
document['msExitFullscreen'] ||
document['webkitCancelFullScreen'] ||
function() {};
canvas.exitFullscreen = canvas.exitFullscreen.bind(document);
if (Browser.lockPointer) canvas.requestPointerLock();
Browser.isFullscreen = true;
if (Browser.resizeCanvas) Browser.setFullscreenCanvasSize();
} else {
// remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen
canvasContainer.parentNode.insertBefore(canvas, canvasContainer);
canvasContainer.parentNode.removeChild(canvasContainer);
if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();
}
if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullscreen);
if (Module['onFullscreen']) Module['onFullscreen'](Browser.isFullscreen);
Browser.updateCanvasDimensions(canvas);
}
if (!Browser.fullscreenHandlersInstalled) {
Browser.fullscreenHandlersInstalled = true;
document.addEventListener('fullscreenchange', fullscreenChange, false);
document.addEventListener('mozfullscreenchange', fullscreenChange, false);
document.addEventListener('webkitfullscreenchange', fullscreenChange, false);
document.addEventListener('MSFullscreenChange', fullscreenChange, false);
}
// create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root
var canvasContainer = document.createElement("div");
canvas.parentNode.insertBefore(canvasContainer, canvas);
canvasContainer.appendChild(canvas);
// use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size)
canvasContainer.requestFullscreen = canvasContainer['requestFullscreen'] ||
canvasContainer['mozRequestFullScreen'] ||
canvasContainer['msRequestFullscreen'] ||
(canvasContainer['webkitRequestFullscreen'] ? function() { canvasContainer['webkitRequestFullscreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null) ||
(canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);
if (vrDevice) {
canvasContainer.requestFullscreen({ vrDisplay: vrDevice });
} else {
canvasContainer.requestFullscreen();
}
},requestFullScreen:function (lockPointer, resizeCanvas, vrDevice) {
Module.printErr('Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead.');
Browser.requestFullScreen = function(lockPointer, resizeCanvas, vrDevice) {
return Browser.requestFullscreen(lockPointer, resizeCanvas, vrDevice);
}
return Browser.requestFullscreen(lockPointer, resizeCanvas, vrDevice);
},nextRAF:0,fakeRequestAnimationFrame:function (func) {
// try to keep 60fps between calls to here
var now = Date.now();
if (Browser.nextRAF === 0) {
Browser.nextRAF = now + 1000/60;
} else {
while (now + 2 >= Browser.nextRAF) { // fudge a little, to avoid timer jitter causing us to do lots of delay:0
Browser.nextRAF += 1000/60;
}
}
var delay = Math.max(Browser.nextRAF - now, 0);
setTimeout(func, delay);
},requestAnimationFrame:function requestAnimationFrame(func) {
if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)
Browser.fakeRequestAnimationFrame(func);
} else {
if (!window.requestAnimationFrame) {
window.requestAnimationFrame = window['requestAnimationFrame'] ||
window['mozRequestAnimationFrame'] ||
window['webkitRequestAnimationFrame'] ||
window['msRequestAnimationFrame'] ||
window['oRequestAnimationFrame'] ||
Browser.fakeRequestAnimationFrame;
}
window.requestAnimationFrame(func);
}
},safeCallback:function (func) {
return function() {
if (!ABORT) return func.apply(null, arguments);
};
},allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function () {
Browser.allowAsyncCallbacks = false;
},resumeAsyncCallbacks:function () { // marks future callbacks as ok to execute, and synchronously runs any remaining ones right now
Browser.allowAsyncCallbacks = true;
if (Browser.queuedAsyncCallbacks.length > 0) {
var callbacks = Browser.queuedAsyncCallbacks;
Browser.queuedAsyncCallbacks = [];
callbacks.forEach(function(func) {
func();
});
}
},safeRequestAnimationFrame:function (func) {
return Browser.requestAnimationFrame(function() {
if (ABORT) return;
if (Browser.allowAsyncCallbacks) {
func();
} else {
Browser.queuedAsyncCallbacks.push(func);
}
});
},safeSetTimeout:function (func, timeout) {
Module['noExitRuntime'] = true;
return setTimeout(function() {
if (ABORT) return;
if (Browser.allowAsyncCallbacks) {
func();
} else {
Browser.queuedAsyncCallbacks.push(func);
}
}, timeout);
},safeSetInterval:function (func, timeout) {
Module['noExitRuntime'] = true;
return setInterval(function() {
if (ABORT) return;
if (Browser.allowAsyncCallbacks) {
func();
} // drop it on the floor otherwise, next interval will kick in
}, timeout);
},getMimetype:function (name) {
return {
'jpg': 'image/jpeg',
'jpeg': 'image/jpeg',
'png': 'image/png',
'bmp': 'image/bmp',
'ogg': 'audio/ogg',
'wav': 'audio/wav',
'mp3': 'audio/mpeg'
}[name.substr(name.lastIndexOf('.')+1)];
},getUserMedia:function (func) {
if(!window.getUserMedia) {
window.getUserMedia = navigator['getUserMedia'] ||
navigator['mozGetUserMedia'];
}
window.getUserMedia(func);
},getMovementX:function (event) {
return event['movementX'] ||
event['mozMovementX'] ||
event['webkitMovementX'] ||
0;
},getMovementY:function (event) {
return event['movementY'] ||
event['mozMovementY'] ||
event['webkitMovementY'] ||
0;
},getMouseWheelDelta:function (event) {
var delta = 0;
switch (event.type) {
case 'DOMMouseScroll':
delta = event.detail;
break;
case 'mousewheel':
delta = event.wheelDelta;
break;
case 'wheel':
delta = event['deltaY'];
break;
default:
throw 'unrecognized mouse wheel event: ' + event.type;
}
return delta;
},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup
if (Browser.pointerLock) {
// When the pointer is locked, calculate the coordinates
// based on the movement of the mouse.
// Workaround for Firefox bug 764498
if (event.type != 'mousemove' &&
('mozMovementX' in event)) {
Browser.mouseMovementX = Browser.mouseMovementY = 0;
} else {
Browser.mouseMovementX = Browser.getMovementX(event);
Browser.mouseMovementY = Browser.getMovementY(event);
}
// check if SDL is available
if (typeof SDL != "undefined") {
Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
} else {
// just add the mouse delta to the current absolut mouse position
// FIXME: ideally this should be clamped against the canvas size and zero
Browser.mouseX += Browser.mouseMovementX;
Browser.mouseY += Browser.mouseMovementY;
}
} else {
// Otherwise, calculate the movement based on the changes
// in the coordinates.
var rect = Module["canvas"].getBoundingClientRect();
var cw = Module["canvas"].width;
var ch = Module["canvas"].height;
// Neither .scrollX or .pageXOffset are defined in a spec, but
// we prefer .scrollX because it is currently in a spec draft.
// (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)
var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);
var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);
if (event.type === 'touchstart' || event.type === 'touchend' || event.type === 'touchmove') {
var touch = event.touch;
if (touch === undefined) {
return; // the "touch" property is only defined in SDL
}
var adjustedX = touch.pageX - (scrollX + rect.left);
var adjustedY = touch.pageY - (scrollY + rect.top);
adjustedX = adjustedX * (cw / rect.width);
adjustedY = adjustedY * (ch / rect.height);
var coords = { x: adjustedX, y: adjustedY };
if (event.type === 'touchstart') {
Browser.lastTouches[touch.identifier] = coords;
Browser.touches[touch.identifier] = coords;
} else if (event.type === 'touchend' || event.type === 'touchmove') {
var last = Browser.touches[touch.identifier];
if (!last) last = coords;
Browser.lastTouches[touch.identifier] = last;
Browser.touches[touch.identifier] = coords;
}
return;
}
var x = event.pageX - (scrollX + rect.left);
var y = event.pageY - (scrollY + rect.top);
// the canvas might be CSS-scaled compared to its backbuffer;
// SDL-using content will want mouse coordinates in terms
// of backbuffer units.
x = x * (cw / rect.width);
y = y * (ch / rect.height);
Browser.mouseMovementX = x - Browser.mouseX;
Browser.mouseMovementY = y - Browser.mouseY;
Browser.mouseX = x;
Browser.mouseY = y;
}
},asyncLoad:function (url, onload, onerror, noRunDep) {
var dep = !noRunDep ? getUniqueRunDependency('al ' + url) : '';
Module['readAsync'](url, function(arrayBuffer) {
assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).');
onload(new Uint8Array(arrayBuffer));
if (dep) removeRunDependency(dep);
}, function(event) {
if (onerror) {
onerror();
} else {
throw 'Loading data file "' + url + '" failed.';
}
});
if (dep) addRunDependency(dep);
},resizeListeners:[],updateResizeListeners:function () {
var canvas = Module['canvas'];
Browser.resizeListeners.forEach(function(listener) {
listener(canvas.width, canvas.height);
});
},setCanvasSize:function (width, height, noUpdates) {
var canvas = Module['canvas'];
Browser.updateCanvasDimensions(canvas, width, height);
if (!noUpdates) Browser.updateResizeListeners();
},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function () {
// check if SDL is available
if (typeof SDL != "undefined") {
var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
flags = flags | 0x00800000; // set SDL_FULLSCREEN flag
HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
}
Browser.updateResizeListeners();
},setWindowedCanvasSize:function () {
// check if SDL is available
if (typeof SDL != "undefined") {
var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag
HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
}
Browser.updateResizeListeners();
},updateCanvasDimensions:function (canvas, wNative, hNative) {
if (wNative && hNative) {
canvas.widthNative = wNative;
canvas.heightNative = hNative;
} else {
wNative = canvas.widthNative;
hNative = canvas.heightNative;
}
var w = wNative;
var h = hNative;
if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {
if (w/h < Module['forcedAspectRatio']) {
w = Math.round(h * Module['forcedAspectRatio']);
} else {
h = Math.round(w / Module['forcedAspectRatio']);
}
}
if (((document['fullscreenElement'] || document['mozFullScreenElement'] ||
document['msFullscreenElement'] || document['webkitFullscreenElement'] ||
document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {
var factor = Math.min(screen.width / w, screen.height / h);
w = Math.round(w * factor);
h = Math.round(h * factor);
}
if (Browser.resizeCanvas) {
if (canvas.width != w) canvas.width = w;
if (canvas.height != h) canvas.height = h;
if (typeof canvas.style != 'undefined') {
canvas.style.removeProperty( "width");
canvas.style.removeProperty("height");
}
} else {
if (canvas.width != wNative) canvas.width = wNative;
if (canvas.height != hNative) canvas.height = hNative;
if (typeof canvas.style != 'undefined') {
if (w != wNative || h != hNative) {
canvas.style.setProperty( "width", w + "px", "important");
canvas.style.setProperty("height", h + "px", "important");
} else {
canvas.style.removeProperty( "width");
canvas.style.removeProperty("height");
}
}
}
},wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle:function () {
var handle = Browser.nextWgetRequestHandle;
Browser.nextWgetRequestHandle++;
return handle;
}};function _emscripten_set_main_loop_timing(mode, value) {
Browser.mainLoop.timingMode = mode;
Browser.mainLoop.timingValue = value;
if (!Browser.mainLoop.func) {
return 1; // Return non-zero on failure, can't set timing mode when there is no main loop.
}
if (mode == 0 /*EM_TIMING_SETTIMEOUT*/) {
Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setTimeout() {
var timeUntilNextTick = Math.max(0, Browser.mainLoop.tickStartTime + value - _emscripten_get_now())|0;
setTimeout(Browser.mainLoop.runner, timeUntilNextTick); // doing this each time means that on exception, we stop
};
Browser.mainLoop.method = 'timeout';
} else if (mode == 1 /*EM_TIMING_RAF*/) {
Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_rAF() {
Browser.requestAnimationFrame(Browser.mainLoop.runner);
};
Browser.mainLoop.method = 'rAF';
} else if (mode == 2 /*EM_TIMING_SETIMMEDIATE*/) {
if (!window['setImmediate']) {
// Emulate setImmediate. (note: not a complete polyfill, we don't emulate clearImmediate() to keep code size to minimum, since not needed)
var setImmediates = [];
var emscriptenMainLoopMessageId = 'setimmediate';
function Browser_setImmediate_messageHandler(event) {
if (event.source === window && event.data === emscriptenMainLoopMessageId) {
event.stopPropagation();
setImmediates.shift()();
}
}
window.addEventListener("message", Browser_setImmediate_messageHandler, true);
window['setImmediate'] = function Browser_emulated_setImmediate(func) {
setImmediates.push(func);
if (ENVIRONMENT_IS_WORKER) {
if (Module['setImmediates'] === undefined) Module['setImmediates'] = [];
Module['setImmediates'].push(func);
window.postMessage({target: emscriptenMainLoopMessageId}); // In --proxy-to-worker, route the message via proxyClient.js
} else window.postMessage(emscriptenMainLoopMessageId, "*"); // On the main thread, can just send the message to itself.
}
}
Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setImmediate() {
window['setImmediate'](Browser.mainLoop.runner);
};
Browser.mainLoop.method = 'immediate';
}
return 0;
}
Module["_pthread_mutex_lock"] = _pthread_mutex_lock;
function _emscripten_glStencilFunc(x0, x1, x2) { GLctx['stencilFunc'](x0, x1, x2) }
var JSEvents={keyEvent:0,mouseEvent:0,wheelEvent:0,uiEvent:0,focusEvent:0,deviceOrientationEvent:0,deviceMotionEvent:0,fullscreenChangeEvent:0,pointerlockChangeEvent:0,visibilityChangeEvent:0,touchEvent:0,lastGamepadState:null,lastGamepadStateFrame:null,previousFullscreenElement:null,previousScreenX:null,previousScreenY:null,removeEventListenersRegistered:false,registerRemoveEventListeners:function () {
if (!JSEvents.removeEventListenersRegistered) {
__ATEXIT__.push(function() {
for(var i = JSEvents.eventHandlers.length-1; i >= 0; --i) {
JSEvents._removeHandler(i);
}
});
JSEvents.removeEventListenersRegistered = true;
}
},findEventTarget:function (target) {
if (target) {
if (typeof target == "number") {
target = Pointer_stringify(target);
}
if (target == '#window') return window;
else if (target == '#document') return document;
else if (target == '#screen') return window.screen;
else if (target == '#canvas') return Module['canvas'];
if (typeof target == 'string') return document.getElementById(target);
else return target;
} else {
// The sensible target varies between events, but use window as the default
// since DOM events mostly can default to that. Specific callback registrations
// override their own defaults.
return window;
}
},deferredCalls:[],deferCall:function (targetFunction, precedence, argsList) {
function arraysHaveEqualContent(arrA, arrB) {
if (arrA.length != arrB.length) return false;
for(var i in arrA) {
if (arrA[i] != arrB[i]) return false;
}
return true;
}
// Test if the given call was already queued, and if so, don't add it again.
for(var i in JSEvents.deferredCalls) {
var call = JSEvents.deferredCalls[i];
if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) {
return;
}
}
JSEvents.deferredCalls.push({
targetFunction: targetFunction,
precedence: precedence,
argsList: argsList
});
JSEvents.deferredCalls.sort(function(x,y) { return x.precedence < y.precedence; });
},removeDeferredCalls:function (targetFunction) {
for(var i = 0; i < JSEvents.deferredCalls.length; ++i) {
if (JSEvents.deferredCalls[i].targetFunction == targetFunction) {
JSEvents.deferredCalls.splice(i, 1);
--i;
}
}
},canPerformEventHandlerRequests:function () {
return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls;
},runDeferredCalls:function () {
if (!JSEvents.canPerformEventHandlerRequests()) {
return;
}
for(var i = 0; i < JSEvents.deferredCalls.length; ++i) {
var call = JSEvents.deferredCalls[i];
JSEvents.deferredCalls.splice(i, 1);
--i;
call.targetFunction.apply(this, call.argsList);
}
},inEventHandler:0,currentEventHandler:null,eventHandlers:[],isInternetExplorer:function () { return navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0; },removeAllHandlersOnTarget:function (target, eventTypeString) {
for(var i = 0; i < JSEvents.eventHandlers.length; ++i) {
if (JSEvents.eventHandlers[i].target == target &&
(!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) {
JSEvents._removeHandler(i--);
}
}
},_removeHandler:function (i) {
var h = JSEvents.eventHandlers[i];
h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture);
JSEvents.eventHandlers.splice(i, 1);
},registerOrRemoveHandler:function (eventHandler) {
var jsEventHandler = function jsEventHandler(event) {
// Increment nesting count for the event handler.
++JSEvents.inEventHandler;
JSEvents.currentEventHandler = eventHandler;
// Process any old deferred calls the user has placed.
JSEvents.runDeferredCalls();
// Process the actual event, calls back to user C code handler.
eventHandler.handlerFunc(event);
// Process any new deferred calls that were placed right now from this event handler.
JSEvents.runDeferredCalls();
// Out of event handler - restore nesting count.
--JSEvents.inEventHandler;
}
if (eventHandler.callbackfunc) {
eventHandler.eventListenerFunc = jsEventHandler;
eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture);
JSEvents.eventHandlers.push(eventHandler);
JSEvents.registerRemoveEventListeners();
} else {
for(var i = 0; i < JSEvents.eventHandlers.length; ++i) {
if (JSEvents.eventHandlers[i].target == eventHandler.target
&& JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) {
JSEvents._removeHandler(i--);
}
}
}
},registerKeyEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.keyEvent) {
JSEvents.keyEvent = _malloc( 164 );
}
var handlerFunc = function(event) {
var e = event || window.event;
stringToUTF8(e.key ? e.key : "", JSEvents.keyEvent + 0, 32);
stringToUTF8(e.code ? e.code : "", JSEvents.keyEvent + 32, 32);
HEAP32[(((JSEvents.keyEvent)+(64))>>2)]=e.location;
HEAP32[(((JSEvents.keyEvent)+(68))>>2)]=e.ctrlKey;
HEAP32[(((JSEvents.keyEvent)+(72))>>2)]=e.shiftKey;
HEAP32[(((JSEvents.keyEvent)+(76))>>2)]=e.altKey;
HEAP32[(((JSEvents.keyEvent)+(80))>>2)]=e.metaKey;
HEAP32[(((JSEvents.keyEvent)+(84))>>2)]=e.repeat;
stringToUTF8(e.locale ? e.locale : "", JSEvents.keyEvent + 88, 32);
stringToUTF8(e.char ? e.char : "", JSEvents.keyEvent + 120, 32);
HEAP32[(((JSEvents.keyEvent)+(152))>>2)]=e.charCode;
HEAP32[(((JSEvents.keyEvent)+(156))>>2)]=e.keyCode;
HEAP32[(((JSEvents.keyEvent)+(160))>>2)]=e.which;
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.keyEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: JSEvents.findEventTarget(target),
allowsDeferredCalls: JSEvents.isInternetExplorer() ? false : true, // MSIE doesn't allow fullscreen and pointerlock requests from key handlers, others do.
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},getBoundingClientRectOrZeros:function (target) {
return target.getBoundingClientRect ? target.getBoundingClientRect() : { left: 0, top: 0 };
},fillMouseEventData:function (eventStruct, e, target) {
HEAPF64[((eventStruct)>>3)]=JSEvents.tick();
HEAP32[(((eventStruct)+(8))>>2)]=e.screenX;
HEAP32[(((eventStruct)+(12))>>2)]=e.screenY;
HEAP32[(((eventStruct)+(16))>>2)]=e.clientX;
HEAP32[(((eventStruct)+(20))>>2)]=e.clientY;
HEAP32[(((eventStruct)+(24))>>2)]=e.ctrlKey;
HEAP32[(((eventStruct)+(28))>>2)]=e.shiftKey;
HEAP32[(((eventStruct)+(32))>>2)]=e.altKey;
HEAP32[(((eventStruct)+(36))>>2)]=e.metaKey;
HEAP16[(((eventStruct)+(40))>>1)]=e.button;
HEAP16[(((eventStruct)+(42))>>1)]=e.buttons;
HEAP32[(((eventStruct)+(44))>>2)]=e["movementX"] || e["mozMovementX"] || e["webkitMovementX"] || (e.screenX-JSEvents.previousScreenX);
HEAP32[(((eventStruct)+(48))>>2)]=e["movementY"] || e["mozMovementY"] || e["webkitMovementY"] || (e.screenY-JSEvents.previousScreenY);
if (Module['canvas']) {
var rect = Module['canvas'].getBoundingClientRect();
HEAP32[(((eventStruct)+(60))>>2)]=e.clientX - rect.left;
HEAP32[(((eventStruct)+(64))>>2)]=e.clientY - rect.top;
} else { // Canvas is not initialized, return 0.
HEAP32[(((eventStruct)+(60))>>2)]=0;
HEAP32[(((eventStruct)+(64))>>2)]=0;
}
if (target) {
var rect = JSEvents.getBoundingClientRectOrZeros(target);
HEAP32[(((eventStruct)+(52))>>2)]=e.clientX - rect.left;
HEAP32[(((eventStruct)+(56))>>2)]=e.clientY - rect.top;
} else { // No specific target passed, return 0.
HEAP32[(((eventStruct)+(52))>>2)]=0;
HEAP32[(((eventStruct)+(56))>>2)]=0;
}
JSEvents.previousScreenX = e.screenX;
JSEvents.previousScreenY = e.screenY;
},registerMouseEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.mouseEvent) {
JSEvents.mouseEvent = _malloc( 72 );
}
target = JSEvents.findEventTarget(target);
var handlerFunc = function(event) {
var e = event || window.event;
JSEvents.fillMouseEventData(JSEvents.mouseEvent, e, target);
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.mouseEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: target,
allowsDeferredCalls: eventTypeString != 'mousemove' && eventTypeString != 'mouseenter' && eventTypeString != 'mouseleave', // Mouse move events do not allow fullscreen/pointer lock requests to be handled in them!
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
// In IE, mousedown events don't either allow deferred calls to be run!
if (JSEvents.isInternetExplorer() && eventTypeString == 'mousedown') eventHandler.allowsDeferredCalls = false;
JSEvents.registerOrRemoveHandler(eventHandler);
},registerWheelEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.wheelEvent) {
JSEvents.wheelEvent = _malloc( 104 );
}
target = JSEvents.findEventTarget(target);
// The DOM Level 3 events spec event 'wheel'
var wheelHandlerFunc = function(event) {
var e = event || window.event;
JSEvents.fillMouseEventData(JSEvents.wheelEvent, e, target);
HEAPF64[(((JSEvents.wheelEvent)+(72))>>3)]=e["deltaX"];
HEAPF64[(((JSEvents.wheelEvent)+(80))>>3)]=e["deltaY"];
HEAPF64[(((JSEvents.wheelEvent)+(88))>>3)]=e["deltaZ"];
HEAP32[(((JSEvents.wheelEvent)+(96))>>2)]=e["deltaMode"];
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.wheelEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
// The 'mousewheel' event as implemented in Safari 6.0.5
var mouseWheelHandlerFunc = function(event) {
var e = event || window.event;
JSEvents.fillMouseEventData(JSEvents.wheelEvent, e, target);
HEAPF64[(((JSEvents.wheelEvent)+(72))>>3)]=e["wheelDeltaX"] || 0;
HEAPF64[(((JSEvents.wheelEvent)+(80))>>3)]=-(e["wheelDeltaY"] ? e["wheelDeltaY"] : e["wheelDelta"]) /* 1. Invert to unify direction with the DOM Level 3 wheel event. 2. MSIE does not provide wheelDeltaY, so wheelDelta is used as a fallback. */;
HEAPF64[(((JSEvents.wheelEvent)+(88))>>3)]=0 /* Not available */;
HEAP32[(((JSEvents.wheelEvent)+(96))>>2)]=0 /* DOM_DELTA_PIXEL */;
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.wheelEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: target,
allowsDeferredCalls: true,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: (eventTypeString == 'wheel') ? wheelHandlerFunc : mouseWheelHandlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},pageScrollPos:function () {
if (window.pageXOffset > 0 || window.pageYOffset > 0) {
return [window.pageXOffset, window.pageYOffset];
}
if (typeof document.documentElement.scrollLeft !== 'undefined' || typeof document.documentElement.scrollTop !== 'undefined') {
return [document.documentElement.scrollLeft, document.documentElement.scrollTop];
}
return [document.body.scrollLeft|0, document.body.scrollTop|0];
},registerUiEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.uiEvent) {
JSEvents.uiEvent = _malloc( 36 );
}
if (eventTypeString == "scroll" && !target) {
target = document; // By default read scroll events on document rather than window.
} else {
target = JSEvents.findEventTarget(target);
}
var handlerFunc = function(event) {
var e = event || window.event;
if (e.target != target) {
// Never take ui events such as scroll via a 'bubbled' route, but always from the direct element that
// was targeted. Otherwise e.g. if app logs a message in response to a page scroll, the Emscripten log
// message box could cause to scroll, generating a new (bubbled) scroll message, causing a new log print,
// causing a new scroll, etc..
return;
}
var scrollPos = JSEvents.pageScrollPos();
HEAP32[((JSEvents.uiEvent)>>2)]=e.detail;
HEAP32[(((JSEvents.uiEvent)+(4))>>2)]=document.body.clientWidth;
HEAP32[(((JSEvents.uiEvent)+(8))>>2)]=document.body.clientHeight;
HEAP32[(((JSEvents.uiEvent)+(12))>>2)]=window.innerWidth;
HEAP32[(((JSEvents.uiEvent)+(16))>>2)]=window.innerHeight;
HEAP32[(((JSEvents.uiEvent)+(20))>>2)]=window.outerWidth;
HEAP32[(((JSEvents.uiEvent)+(24))>>2)]=window.outerHeight;
HEAP32[(((JSEvents.uiEvent)+(28))>>2)]=scrollPos[0];
HEAP32[(((JSEvents.uiEvent)+(32))>>2)]=scrollPos[1];
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.uiEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: target,
allowsDeferredCalls: false, // Neither scroll or resize events allow running requests inside them.
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},getNodeNameForTarget:function (target) {
if (!target) return '';
if (target == window) return '#window';
if (target == window.screen) return '#screen';
return (target && target.nodeName) ? target.nodeName : '';
},registerFocusEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.focusEvent) {
JSEvents.focusEvent = _malloc( 256 );
}
var handlerFunc = function(event) {
var e = event || window.event;
var nodeName = JSEvents.getNodeNameForTarget(e.target);
var id = e.target.id ? e.target.id : '';
stringToUTF8(nodeName, JSEvents.focusEvent + 0, 128);
stringToUTF8(id, JSEvents.focusEvent + 128, 128);
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.focusEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: JSEvents.findEventTarget(target),
allowsDeferredCalls: false,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},tick:function () {
if (window['performance'] && window['performance']['now']) return window['performance']['now']();
else return Date.now();
},registerDeviceOrientationEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.deviceOrientationEvent) {
JSEvents.deviceOrientationEvent = _malloc( 40 );
}
var handlerFunc = function(event) {
var e = event || window.event;
HEAPF64[((JSEvents.deviceOrientationEvent)>>3)]=JSEvents.tick();
HEAPF64[(((JSEvents.deviceOrientationEvent)+(8))>>3)]=e.alpha;
HEAPF64[(((JSEvents.deviceOrientationEvent)+(16))>>3)]=e.beta;
HEAPF64[(((JSEvents.deviceOrientationEvent)+(24))>>3)]=e.gamma;
HEAP32[(((JSEvents.deviceOrientationEvent)+(32))>>2)]=e.absolute;
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.deviceOrientationEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: JSEvents.findEventTarget(target),
allowsDeferredCalls: false,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},registerDeviceMotionEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.deviceMotionEvent) {
JSEvents.deviceMotionEvent = _malloc( 80 );
}
var handlerFunc = function(event) {
var e = event || window.event;
HEAPF64[((JSEvents.deviceOrientationEvent)>>3)]=JSEvents.tick();
HEAPF64[(((JSEvents.deviceMotionEvent)+(8))>>3)]=e.acceleration.x;
HEAPF64[(((JSEvents.deviceMotionEvent)+(16))>>3)]=e.acceleration.y;
HEAPF64[(((JSEvents.deviceMotionEvent)+(24))>>3)]=e.acceleration.z;
HEAPF64[(((JSEvents.deviceMotionEvent)+(32))>>3)]=e.accelerationIncludingGravity.x;
HEAPF64[(((JSEvents.deviceMotionEvent)+(40))>>3)]=e.accelerationIncludingGravity.y;
HEAPF64[(((JSEvents.deviceMotionEvent)+(48))>>3)]=e.accelerationIncludingGravity.z;
HEAPF64[(((JSEvents.deviceMotionEvent)+(56))>>3)]=e.rotationRate.alpha;
HEAPF64[(((JSEvents.deviceMotionEvent)+(64))>>3)]=e.rotationRate.beta;
HEAPF64[(((JSEvents.deviceMotionEvent)+(72))>>3)]=e.rotationRate.gamma;
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.deviceMotionEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: JSEvents.findEventTarget(target),
allowsDeferredCalls: false,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},screenOrientation:function () {
if (!window.screen) return undefined;
return window.screen.orientation || window.screen.mozOrientation || window.screen.webkitOrientation || window.screen.msOrientation;
},fillOrientationChangeEventData:function (eventStruct, e) {
var orientations = ["portrait-primary", "portrait-secondary", "landscape-primary", "landscape-secondary"];
var orientations2 = ["portrait", "portrait", "landscape", "landscape"];
var orientationString = JSEvents.screenOrientation();
var orientation = orientations.indexOf(orientationString);
if (orientation == -1) {
orientation = orientations2.indexOf(orientationString);
}
HEAP32[((eventStruct)>>2)]=1 << orientation;
HEAP32[(((eventStruct)+(4))>>2)]=window.orientation;
},registerOrientationChangeEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.orientationChangeEvent) {
JSEvents.orientationChangeEvent = _malloc( 8 );
}
if (!target) {
target = window.screen; // Orientation events need to be captured from 'window.screen' instead of 'window'
} else {
target = JSEvents.findEventTarget(target);
}
var handlerFunc = function(event) {
var e = event || window.event;
JSEvents.fillOrientationChangeEventData(JSEvents.orientationChangeEvent, e);
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.orientationChangeEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
if (eventTypeString == "orientationchange" && window.screen.mozOrientation !== undefined) {
eventTypeString = "mozorientationchange";
}
var eventHandler = {
target: target,
allowsDeferredCalls: false,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},fullscreenEnabled:function () {
return document.fullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled || document.msFullscreenEnabled;
},fillFullscreenChangeEventData:function (eventStruct, e) {
var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
var isFullscreen = !!fullscreenElement;
HEAP32[((eventStruct)>>2)]=isFullscreen;
HEAP32[(((eventStruct)+(4))>>2)]=JSEvents.fullscreenEnabled();
// If transitioning to fullscreen, report info about the element that is now fullscreen.
// If transitioning to windowed mode, report info about the element that just was fullscreen.
var reportedElement = isFullscreen ? fullscreenElement : JSEvents.previousFullscreenElement;
var nodeName = JSEvents.getNodeNameForTarget(reportedElement);
var id = (reportedElement && reportedElement.id) ? reportedElement.id : '';
stringToUTF8(nodeName, eventStruct + 8, 128);
stringToUTF8(id, eventStruct + 136, 128);
HEAP32[(((eventStruct)+(264))>>2)]=reportedElement ? reportedElement.clientWidth : 0;
HEAP32[(((eventStruct)+(268))>>2)]=reportedElement ? reportedElement.clientHeight : 0;
HEAP32[(((eventStruct)+(272))>>2)]=screen.width;
HEAP32[(((eventStruct)+(276))>>2)]=screen.height;
if (isFullscreen) {
JSEvents.previousFullscreenElement = fullscreenElement;
}
},registerFullscreenChangeEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.fullscreenChangeEvent) {
JSEvents.fullscreenChangeEvent = _malloc( 280 );
}
if (!target) {
target = document; // Fullscreen change events need to be captured from 'document' by default instead of 'window'
} else {
target = JSEvents.findEventTarget(target);
}
var handlerFunc = function(event) {
var e = event || window.event;
JSEvents.fillFullscreenChangeEventData(JSEvents.fullscreenChangeEvent, e);
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.fullscreenChangeEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: target,
allowsDeferredCalls: false,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},resizeCanvasForFullscreen:function (target, strategy) {
var restoreOldStyle = __registerRestoreOldStyle(target);
var cssWidth = strategy.softFullscreen ? window.innerWidth : screen.width;
var cssHeight = strategy.softFullscreen ? window.innerHeight : screen.height;
var rect = target.getBoundingClientRect();
var windowedCssWidth = rect.right - rect.left;
var windowedCssHeight = rect.bottom - rect.top;
var windowedRttWidth = target.width;
var windowedRttHeight = target.height;
if (strategy.scaleMode == 3) {
__setLetterbox(target, (cssHeight - windowedCssHeight) / 2, (cssWidth - windowedCssWidth) / 2);
cssWidth = windowedCssWidth;
cssHeight = windowedCssHeight;
} else if (strategy.scaleMode == 2) {
if (cssWidth*windowedRttHeight < windowedRttWidth*cssHeight) {
var desiredCssHeight = windowedRttHeight * cssWidth / windowedRttWidth;
__setLetterbox(target, (cssHeight - desiredCssHeight) / 2, 0);
cssHeight = desiredCssHeight;
} else {
var desiredCssWidth = windowedRttWidth * cssHeight / windowedRttHeight;
__setLetterbox(target, 0, (cssWidth - desiredCssWidth) / 2);
cssWidth = desiredCssWidth;
}
}
// If we are adding padding, must choose a background color or otherwise Chrome will give the
// padding a default white color. Do it only if user has not customized their own background color.
if (!target.style.backgroundColor) target.style.backgroundColor = 'black';
// IE11 does the same, but requires the color to be set in the document body.
if (!document.body.style.backgroundColor) document.body.style.backgroundColor = 'black'; // IE11
// Firefox always shows black letterboxes independent of style color.
target.style.width = cssWidth + 'px';
target.style.height = cssHeight + 'px';
if (strategy.filteringMode == 1) {
target.style.imageRendering = 'optimizeSpeed';
target.style.imageRendering = '-moz-crisp-edges';
target.style.imageRendering = '-o-crisp-edges';
target.style.imageRendering = '-webkit-optimize-contrast';
target.style.imageRendering = 'optimize-contrast';
target.style.imageRendering = 'crisp-edges';
target.style.imageRendering = 'pixelated';
}
var dpiScale = (strategy.canvasResolutionScaleMode == 2) ? window.devicePixelRatio : 1;
if (strategy.canvasResolutionScaleMode != 0) {
target.width = cssWidth * dpiScale;
target.height = cssHeight * dpiScale;
if (target.GLctxObject) target.GLctxObject.GLctx.viewport(0, 0, target.width, target.height);
}
return restoreOldStyle;
},requestFullscreen:function (target, strategy) {
// EMSCRIPTEN_FULLSCREEN_SCALE_DEFAULT + EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE is a mode where no extra logic is performed to the DOM elements.
if (strategy.scaleMode != 0 || strategy.canvasResolutionScaleMode != 0) {
JSEvents.resizeCanvasForFullscreen(target, strategy);
}
if (target.requestFullscreen) {
target.requestFullscreen();
} else if (target.msRequestFullscreen) {
target.msRequestFullscreen();
} else if (target.mozRequestFullScreen) {
target.mozRequestFullScreen();
} else if (target.mozRequestFullscreen) {
target.mozRequestFullscreen();
} else if (target.webkitRequestFullscreen) {
target.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
} else {
if (typeof JSEvents.fullscreenEnabled() === 'undefined') {
return -1;
} else {
return -3;
}
}
if (strategy.canvasResizedCallback) {
Module['dynCall_iiii'](strategy.canvasResizedCallback, 37, 0, strategy.canvasResizedCallbackUserData);
}
return 0;
},fillPointerlockChangeEventData:function (eventStruct, e) {
var pointerLockElement = document.pointerLockElement || document.mozPointerLockElement || document.webkitPointerLockElement || document.msPointerLockElement;
var isPointerlocked = !!pointerLockElement;
HEAP32[((eventStruct)>>2)]=isPointerlocked;
var nodeName = JSEvents.getNodeNameForTarget(pointerLockElement);
var id = (pointerLockElement && pointerLockElement.id) ? pointerLockElement.id : '';
stringToUTF8(nodeName, eventStruct + 4, 128);
stringToUTF8(id, eventStruct + 132, 128);
},registerPointerlockChangeEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.pointerlockChangeEvent) {
JSEvents.pointerlockChangeEvent = _malloc( 260 );
}
if (!target) {
target = document; // Pointer lock change events need to be captured from 'document' by default instead of 'window'
} else {
target = JSEvents.findEventTarget(target);
}
var handlerFunc = function(event) {
var e = event || window.event;
JSEvents.fillPointerlockChangeEventData(JSEvents.pointerlockChangeEvent, e);
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.pointerlockChangeEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: target,
allowsDeferredCalls: false,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},registerPointerlockErrorEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!target) {
target = document; // Pointer lock events need to be captured from 'document' by default instead of 'window'
} else {
target = JSEvents.findEventTarget(target);
}
var handlerFunc = function(event) {
var e = event || window.event;
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, 0, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: target,
allowsDeferredCalls: false,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},requestPointerLock:function (target) {
if (target.requestPointerLock) {
target.requestPointerLock();
} else if (target.mozRequestPointerLock) {
target.mozRequestPointerLock();
} else if (target.webkitRequestPointerLock) {
target.webkitRequestPointerLock();
} else if (target.msRequestPointerLock) {
target.msRequestPointerLock();
} else {
// document.body is known to accept pointer lock, so use that to differentiate if the user passed a bad element,
// or if the whole browser just doesn't support the feature.
if (document.body.requestPointerLock || document.body.mozRequestPointerLock || document.body.webkitRequestPointerLock || document.body.msRequestPointerLock) {
return -3;
} else {
return -1;
}
}
return 0;
},fillVisibilityChangeEventData:function (eventStruct, e) {
var visibilityStates = [ "hidden", "visible", "prerender", "unloaded" ];
var visibilityState = visibilityStates.indexOf(document.visibilityState);
HEAP32[((eventStruct)>>2)]=document.hidden;
HEAP32[(((eventStruct)+(4))>>2)]=visibilityState;
},registerVisibilityChangeEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.visibilityChangeEvent) {
JSEvents.visibilityChangeEvent = _malloc( 8 );
}
if (!target) {
target = document; // Visibility change events need to be captured from 'document' by default instead of 'window'
} else {
target = JSEvents.findEventTarget(target);
}
var handlerFunc = function(event) {
var e = event || window.event;
JSEvents.fillVisibilityChangeEventData(JSEvents.visibilityChangeEvent, e);
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.visibilityChangeEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: target,
allowsDeferredCalls: false,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},registerTouchEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.touchEvent) {
JSEvents.touchEvent = _malloc( 1684 );
}
target = JSEvents.findEventTarget(target);
var handlerFunc = function(event) {
var e = event || window.event;
var touches = {};
for(var i = 0; i < e.touches.length; ++i) {
var touch = e.touches[i];
touches[touch.identifier] = touch;
}
for(var i = 0; i < e.changedTouches.length; ++i) {
var touch = e.changedTouches[i];
touches[touch.identifier] = touch;
touch.changed = true;
}
for(var i = 0; i < e.targetTouches.length; ++i) {
var touch = e.targetTouches[i];
touches[touch.identifier].onTarget = true;
}
var ptr = JSEvents.touchEvent;
HEAP32[(((ptr)+(4))>>2)]=e.ctrlKey;
HEAP32[(((ptr)+(8))>>2)]=e.shiftKey;
HEAP32[(((ptr)+(12))>>2)]=e.altKey;
HEAP32[(((ptr)+(16))>>2)]=e.metaKey;
ptr += 20; // Advance to the start of the touch array.
var canvasRect = Module['canvas'] ? Module['canvas'].getBoundingClientRect() : undefined;
var targetRect = JSEvents.getBoundingClientRectOrZeros(target);
var numTouches = 0;
for(var i in touches) {
var t = touches[i];
HEAP32[((ptr)>>2)]=t.identifier;
HEAP32[(((ptr)+(4))>>2)]=t.screenX;
HEAP32[(((ptr)+(8))>>2)]=t.screenY;
HEAP32[(((ptr)+(12))>>2)]=t.clientX;
HEAP32[(((ptr)+(16))>>2)]=t.clientY;
HEAP32[(((ptr)+(20))>>2)]=t.pageX;
HEAP32[(((ptr)+(24))>>2)]=t.pageY;
HEAP32[(((ptr)+(28))>>2)]=t.changed;
HEAP32[(((ptr)+(32))>>2)]=t.onTarget;
if (canvasRect) {
HEAP32[(((ptr)+(44))>>2)]=t.clientX - canvasRect.left;
HEAP32[(((ptr)+(48))>>2)]=t.clientY - canvasRect.top;
} else {
HEAP32[(((ptr)+(44))>>2)]=0;
HEAP32[(((ptr)+(48))>>2)]=0;
}
HEAP32[(((ptr)+(36))>>2)]=t.clientX - targetRect.left;
HEAP32[(((ptr)+(40))>>2)]=t.clientY - targetRect.top;
ptr += 52;
if (++numTouches >= 32) {
break;
}
}
HEAP32[((JSEvents.touchEvent)>>2)]=numTouches;
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.touchEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: target,
allowsDeferredCalls: false, // XXX Currently disabled, see bug https://bugzilla.mozilla.org/show_bug.cgi?id=966493
// Once the above bug is resolved, enable the following condition if possible:
// allowsDeferredCalls: eventTypeString == 'touchstart',
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},fillGamepadEventData:function (eventStruct, e) {
HEAPF64[((eventStruct)>>3)]=e.timestamp;
for(var i = 0; i < e.axes.length; ++i) {
HEAPF64[(((eventStruct+i*8)+(16))>>3)]=e.axes[i];
}
for(var i = 0; i < e.buttons.length; ++i) {
if (typeof(e.buttons[i]) === 'object') {
HEAPF64[(((eventStruct+i*8)+(528))>>3)]=e.buttons[i].value;
} else {
HEAPF64[(((eventStruct+i*8)+(528))>>3)]=e.buttons[i];
}
}
for(var i = 0; i < e.buttons.length; ++i) {
if (typeof(e.buttons[i]) === 'object') {
HEAP32[(((eventStruct+i*4)+(1040))>>2)]=e.buttons[i].pressed;
} else {
HEAP32[(((eventStruct+i*4)+(1040))>>2)]=e.buttons[i] == 1.0;
}
}
HEAP32[(((eventStruct)+(1296))>>2)]=e.connected;
HEAP32[(((eventStruct)+(1300))>>2)]=e.index;
HEAP32[(((eventStruct)+(8))>>2)]=e.axes.length;
HEAP32[(((eventStruct)+(12))>>2)]=e.buttons.length;
stringToUTF8(e.id, eventStruct + 1304, 64);
stringToUTF8(e.mapping, eventStruct + 1368, 64);
},registerGamepadEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.gamepadEvent) {
JSEvents.gamepadEvent = _malloc( 1432 );
}
var handlerFunc = function(event) {
var e = event || window.event;
JSEvents.fillGamepadEventData(JSEvents.gamepadEvent, e.gamepad);
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.gamepadEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: JSEvents.findEventTarget(target),
allowsDeferredCalls: true,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},registerBeforeUnloadEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
var handlerFunc = function(event) {
var e = event || window.event;
var confirmationMessage = Module['dynCall_iiii'](callbackfunc, eventTypeId, 0, userData);
if (confirmationMessage) {
confirmationMessage = Pointer_stringify(confirmationMessage);
}
if (confirmationMessage) {
e.preventDefault();
e.returnValue = confirmationMessage;
return confirmationMessage;
}
};
var eventHandler = {
target: JSEvents.findEventTarget(target),
allowsDeferredCalls: false,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},battery:function () { return navigator.battery || navigator.mozBattery || navigator.webkitBattery; },fillBatteryEventData:function (eventStruct, e) {
HEAPF64[((eventStruct)>>3)]=e.chargingTime;
HEAPF64[(((eventStruct)+(8))>>3)]=e.dischargingTime;
HEAPF64[(((eventStruct)+(16))>>3)]=e.level;
HEAP32[(((eventStruct)+(24))>>2)]=e.charging;
},registerBatteryEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!JSEvents.batteryEvent) {
JSEvents.batteryEvent = _malloc( 32 );
}
var handlerFunc = function(event) {
var e = event || window.event;
JSEvents.fillBatteryEventData(JSEvents.batteryEvent, JSEvents.battery());
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.batteryEvent, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: JSEvents.findEventTarget(target),
allowsDeferredCalls: false,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
},registerWebGlEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) {
if (!target) {
target = Module['canvas'];
}
var handlerFunc = function(event) {
var e = event || window.event;
var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, 0, userData);
if (shouldCancel) {
e.preventDefault();
}
};
var eventHandler = {
target: JSEvents.findEventTarget(target),
allowsDeferredCalls: false,
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
}};var __currentFullscreenStrategy={};function _emscripten_exit_fullscreen() {
if (typeof JSEvents.fullscreenEnabled() === 'undefined') return -1;
// Make sure no queued up calls will fire after this.
JSEvents.removeDeferredCalls(JSEvents.requestFullscreen);
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else {
return -1;
}
if (__currentFullscreenStrategy.canvasResizedCallback) {
Module['dynCall_iiii'](__currentFullscreenStrategy.canvasResizedCallback, 37, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData);
}
return 0;
}
function _glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer) {
GLctx.framebufferRenderbuffer(target, attachment, renderbuffertarget,
GL.renderbuffers[renderbuffer]);
}
function _emscripten_glVertexPointer(){ throw 'Legacy GL function (glVertexPointer) called. If you want legacy GL emulation, you need to compile with -s LEGACY_GL_EMULATION=1 to enable legacy GL emulation.'; }
function _emscripten_glUniform3iv(location, count, value) {
location = GL.uniforms[location];
count *= 3;
value = HEAP32.subarray((value)>>2,(value+count*4)>>2);
GLctx.uniform3iv(location, value);
}
function _glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data) {
var heapView;
if (data) {
heapView = HEAPU8.subarray((data),(data+imageSize));
} else {
heapView = null;
}
GLctx['compressedTexSubImage2D'](target, level, xoffset, yoffset, zoffset, width, height, depth, format, heapView);
}
var _llvm_pow_f32=Math_pow;
function _glBindSampler(unit, sampler) {
GLctx['bindSampler'](unit, sampler ? GL.samplers[sampler] : null);
}
function _glProgramParameteri(program, pname, value) {
GL.recordError(0x0500/*GL_INVALID_ENUM*/);
}
function _emscripten_glTexParameterf(x0, x1, x2) { GLctx['texParameterf'](x0, x1, x2) }
function _emscripten_webgl_destroy_context(contextHandle) {
GL.deleteContext(contextHandle);
}
function emscriptenWebGLGetIndexed(target, index, data, type) {
if (!data) {
// GLES2 specification does not specify how to behave if data is a null pointer. Since calling this function does not make sense
// if data == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
var result = GLctx['getIndexedParameter'](target, index);
var ret;
switch (typeof result) {
case 'boolean':
ret = result ? 1 : 0;
break;
case 'number':
ret = result;
break;
case 'object':
if (result === null) {
switch (target) {
case 0x8C8F: // TRANSFORM_FEEDBACK_BUFFER_BINDING
case 0x8A28: // UNIFORM_BUFFER_BINDING
ret = 0;
break;
default: {
GL.recordError(0x0500); // GL_INVALID_ENUM
return;
}
}
} else if (result instanceof WebGLBuffer) {
ret = result.name | 0;
} else {
GL.recordError(0x0500); // GL_INVALID_ENUM
return;
}
break;
default:
GL.recordError(0x0500); // GL_INVALID_ENUM
return;
}
switch (type) {
case 'Integer64': (tempI64 = [ret>>>0,(tempDouble=ret,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((data)>>2)]=tempI64[0],HEAP32[(((data)+(4))>>2)]=tempI64[1]); break;
case 'Integer': HEAP32[((data)>>2)]=ret; break;
case 'Float': HEAPF32[((data)>>2)]=ret; break;
case 'Boolean': HEAP8[((data)>>0)]=ret ? 1 : 0; break;
default: throw 'internal emscriptenWebGLGetIndexed() error, bad type: ' + type;
}
}function _glGetIntegeri_v(target, index, data) {
emscriptenWebGLGetIndexed(target, index, data, 'Integer');
}
function _emscripten_glTexParameteri(x0, x1, x2) { GLctx['texParameteri'](x0, x1, x2) }
function _glCompileShader(shader) {
GLctx.compileShader(GL.shaders[shader]);
}
var ___tm_current=STATICTOP; STATICTOP += 48;;
var ___tm_timezone=allocate(intArrayFromString("GMT"), "i8", ALLOC_STATIC);
var _tzname=STATICTOP; STATICTOP += 16;;
var _daylight=STATICTOP; STATICTOP += 16;;
var _timezone=STATICTOP; STATICTOP += 16;;function _tzset() {
// TODO: Use (malleable) environment variables instead of system settings.
if (_tzset.called) return;
_tzset.called = true;
HEAP32[((_timezone)>>2)]=-(new Date()).getTimezoneOffset() * 60;
var winter = new Date(2000, 0, 1);
var summer = new Date(2000, 6, 1);
HEAP32[((_daylight)>>2)]=Number(winter.getTimezoneOffset() != summer.getTimezoneOffset());
function extractZone(date) {
var match = date.toTimeString().match(/\(([A-Za-z ]+)\)$/);
return match ? match[1] : "GMT";
};
var winterName = extractZone(winter);
var summerName = extractZone(summer);
var winterNamePtr = allocate(intArrayFromString(winterName), 'i8', ALLOC_NORMAL);
var summerNamePtr = allocate(intArrayFromString(summerName), 'i8', ALLOC_NORMAL);
if (summer.getTimezoneOffset() < winter.getTimezoneOffset()) {
// Northern hemisphere
HEAP32[((_tzname)>>2)]=winterNamePtr;
HEAP32[(((_tzname)+(4))>>2)]=summerNamePtr;
} else {
HEAP32[((_tzname)>>2)]=summerNamePtr;
HEAP32[(((_tzname)+(4))>>2)]=winterNamePtr;
}
}function _localtime_r(time, tmPtr) {
_tzset();
var date = new Date(HEAP32[((time)>>2)]*1000);
HEAP32[((tmPtr)>>2)]=date.getSeconds();
HEAP32[(((tmPtr)+(4))>>2)]=date.getMinutes();
HEAP32[(((tmPtr)+(8))>>2)]=date.getHours();
HEAP32[(((tmPtr)+(12))>>2)]=date.getDate();
HEAP32[(((tmPtr)+(16))>>2)]=date.getMonth();
HEAP32[(((tmPtr)+(20))>>2)]=date.getFullYear()-1900;
HEAP32[(((tmPtr)+(24))>>2)]=date.getDay();
var start = new Date(date.getFullYear(), 0, 1);
var yday = ((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24))|0;
HEAP32[(((tmPtr)+(28))>>2)]=yday;
HEAP32[(((tmPtr)+(36))>>2)]=-(date.getTimezoneOffset() * 60);
// DST is in December in South
var summerOffset = new Date(2000, 6, 1).getTimezoneOffset();
var winterOffset = start.getTimezoneOffset();
var dst = (date.getTimezoneOffset() == Math.min(winterOffset, summerOffset))|0;
HEAP32[(((tmPtr)+(32))>>2)]=dst;
var zonePtr = HEAP32[(((_tzname)+(dst ? Runtime.QUANTUM_SIZE : 0))>>2)];
HEAP32[(((tmPtr)+(40))>>2)]=zonePtr;
return tmPtr;
}function _localtime(time) {
return _localtime_r(time, ___tm_current);
}
function _emscripten_glFrustum() {
Module['printErr']('missing function: emscripten_glFrustum'); abort(-1);
}
function _emscripten_glGetTexParameterfv(target, pname, params) {
if (!params) {
// GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense
// if p == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
HEAPF32[((params)>>2)]=GLctx.getTexParameter(target, pname);
}
function _emscripten_glBindRenderbuffer(target, renderbuffer) {
GLctx.bindRenderbuffer(target, renderbuffer ? GL.renderbuffers[renderbuffer] : null);
}
function _glVertexAttribIPointer(index, size, type, stride, ptr) {
GLctx.vertexAttribIPointer(index, size, type, stride, ptr);
}
function __emscripten_sample_gamepad_data() {
// Produce a new Gamepad API sample if we are ticking a new game frame, or if not using emscripten_set_main_loop() at all to drive animation.
if (Browser.mainLoop.currentFrameNumber !== JSEvents.lastGamepadStateFrame || !Browser.mainLoop.currentFrameNumber) {
JSEvents.lastGamepadState = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads : null);
JSEvents.lastGamepadStateFrame = Browser.mainLoop.currentFrameNumber;
}
}function _emscripten_get_gamepad_status(index, gamepadState) {
__emscripten_sample_gamepad_data();
if (!JSEvents.lastGamepadState) return -1;
// INVALID_PARAM is returned on a Gamepad index that never was there.
if (index < 0 || index >= JSEvents.lastGamepadState.length) return -5;
// NO_DATA is returned on a Gamepad index that was removed.
// For previously disconnected gamepads there should be an empty slot (null/undefined/false) at the index.
// This is because gamepads must keep their original position in the array.
// For example, removing the first of two gamepads produces [null/undefined/false, gamepad].
if (!JSEvents.lastGamepadState[index]) return -7;
JSEvents.fillGamepadEventData(gamepadState, JSEvents.lastGamepadState[index]);
return 0;
}
var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};
var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};
function ___setErrNo(value) {
if (Module['___errno_location']) HEAP32[((Module['___errno_location']())>>2)]=value;
return value;
}
var PATH={splitPath:function (filename) {
var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
return splitPathRe.exec(filename).slice(1);
},normalizeArray:function (parts, allowAboveRoot) {
// if the path tries to go above the root, `up` ends up > 0
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 the path is allowed to go above the root, restore leading ..s
if (allowAboveRoot) {
for (; up--; up) {
parts.unshift('..');
}
}
return parts;
},normalize:function (path) {
var isAbsolute = path.charAt(0) === '/',
trailingSlash = path.substr(-1) === '/';
// Normalize the path
path = PATH.normalizeArray(path.split('/').filter(function(p) {
return !!p;
}), !isAbsolute).join('/');
if (!path && !isAbsolute) {
path = '.';
}
if (path && trailingSlash) {
path += '/';
}
return (isAbsolute ? '/' : '') + path;
},dirname:function (path) {
var result = PATH.splitPath(path),
root = result[0],
dir = result[1];
if (!root && !dir) {
// No dirname whatsoever
return '.';
}
if (dir) {
// It has a dirname, strip trailing slash
dir = dir.substr(0, dir.length - 1);
}
return root + dir;
},basename:function (path) {
// EMSCRIPTEN return '/'' for '/', not an empty string
if (path === '/') return '/';
var lastSlash = path.lastIndexOf('/');
if (lastSlash === -1) return path;
return path.substr(lastSlash+1);
},extname:function (path) {
return PATH.splitPath(path)[3];
},join:function () {
var paths = Array.prototype.slice.call(arguments, 0);
return PATH.normalize(paths.join('/'));
},join2:function (l, r) {
return PATH.normalize(l + '/' + r);
},resolve:function () {
var resolvedPath = '',
resolvedAbsolute = false;
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
var path = (i >= 0) ? arguments[i] : FS.cwd();
// Skip empty and invalid entries
if (typeof path !== 'string') {
throw new TypeError('Arguments to path.resolve must be strings');
} else if (!path) {
return ''; // an invalid portion invalidates the whole thing
}
resolvedPath = path + '/' + resolvedPath;
resolvedAbsolute = path.charAt(0) === '/';
}
// At this point the path should be resolved to a full absolute path, but
// handle relative paths to be safe (might happen when process.cwd() fails)
resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {
return !!p;
}), !resolvedAbsolute).join('/');
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
},relative:function (from, to) {
from = PATH.resolve(from).substr(1);
to = PATH.resolve(to).substr(1);
function trim(arr) {
var start = 0;
for (; start < arr.length; start++) {
if (arr[start] !== '') break;
}
var end = arr.length - 1;
for (; end >= 0; end--) {
if (arr[end] !== '') break;
}
if (start > end) return [];
return arr.slice(start, end - start + 1);
}
var fromParts = trim(from.split('/'));
var toParts = trim(to.split('/'));
var length = Math.min(fromParts.length, toParts.length);
var samePartsLength = length;
for (var i = 0; i < length; i++) {
if (fromParts[i] !== toParts[i]) {
samePartsLength = i;
break;
}
}
var outputParts = [];
for (var i = samePartsLength; i < fromParts.length; i++) {
outputParts.push('..');
}
outputParts = outputParts.concat(toParts.slice(samePartsLength));
return outputParts.join('/');
}};
var TTY={ttys:[],init:function () {
// https://github.com/kripken/emscripten/pull/1555
// if (ENVIRONMENT_IS_NODE) {
// // currently, FS.init does not distinguish if process.stdin is a file or TTY
// // device, it always assumes it's a TTY device. because of this, we're forcing
// // process.stdin to UTF8 encoding to at least make stdin reading compatible
// // with text files until FS.init can be refactored.
// process['stdin']['setEncoding']('utf8');
// }
},shutdown:function () {
// https://github.com/kripken/emscripten/pull/1555
// if (ENVIRONMENT_IS_NODE) {
// // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?
// // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation
// // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?
// // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle
// // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call
// process['stdin']['pause']();
// }
},register:function (dev, ops) {
TTY.ttys[dev] = { input: [], output: [], ops: ops };
FS.registerDevice(dev, TTY.stream_ops);
},stream_ops:{open:function (stream) {
var tty = TTY.ttys[stream.node.rdev];
if (!tty) {
throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
}
stream.tty = tty;
stream.seekable = false;
},close:function (stream) {
// flush any pending line data
stream.tty.ops.flush(stream.tty);
},flush:function (stream) {
stream.tty.ops.flush(stream.tty);
},read:function (stream, buffer, offset, length, pos /* ignored */) {
if (!stream.tty || !stream.tty.ops.get_char) {
throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
}
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(ERRNO_CODES.EIO);
}
if (result === undefined && bytesRead === 0) {
throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
}
if (result === null || result === undefined) break;
bytesRead++;
buffer[offset+i] = result;
}
if (bytesRead) {
stream.node.timestamp = Date.now();
}
return bytesRead;
},write:function (stream, buffer, offset, length, pos) {
if (!stream.tty || !stream.tty.ops.put_char) {
throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
}
for (var i = 0; i < length; i++) {
try {
stream.tty.ops.put_char(stream.tty, buffer[offset+i]);
} catch (e) {
throw new FS.ErrnoError(ERRNO_CODES.EIO);
}
}
if (length) {
stream.node.timestamp = Date.now();
}
return i;
}},default_tty_ops:{get_char:function (tty) {
if (!tty.input.length) {
var result = null;
if (ENVIRONMENT_IS_NODE) {
// we will read data by chunks of BUFSIZE
var BUFSIZE = 256;
var buf = new Buffer(BUFSIZE);
var bytesRead = 0;
var isPosixPlatform = (process.platform != 'win32'); // Node doesn't offer a direct check, so test by exclusion
var fd = process.stdin.fd;
if (isPosixPlatform) {
// Linux and Mac cannot use process.stdin.fd (which isn't set up as sync)
var usingDevice = false;
try {
fd = fs.openSync('/dev/stdin', 'r');
usingDevice = true;
} catch (e) {}
}
try {
bytesRead = fs.readSync(fd, buf, 0, BUFSIZE, null);
} catch(e) {
// Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes,
// reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0.
if (e.toString().indexOf('EOF') != -1) bytesRead = 0;
else throw e;
}
if (usingDevice) { fs.closeSync(fd); }
if (bytesRead > 0) {
result = buf.slice(0, bytesRead).toString('utf-8');
} else {
result = null;
}
} else if (typeof window != 'undefined' &&
typeof window.prompt == 'function') {
// Browser.
result = window.prompt('Input: '); // returns null on cancel
if (result !== null) {
result += '\n';
}
} else if (typeof readline == 'function') {
// Command line.
result = readline();
if (result !== null) {
result += '\n';
}
}
if (!result) {
return null;
}
tty.input = intArrayFromString(result, true);
}
return tty.input.shift();
},put_char:function (tty, val) {
if (val === null || val === 10) {
Module['print'](UTF8ArrayToString(tty.output, 0));
tty.output = [];
} else {
if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle.
}
},flush:function (tty) {
if (tty.output && tty.output.length > 0) {
Module['print'](UTF8ArrayToString(tty.output, 0));
tty.output = [];
}
}},default_tty1_ops:{put_char:function (tty, val) {
if (val === null || val === 10) {
Module['printErr'](UTF8ArrayToString(tty.output, 0));
tty.output = [];
} else {
if (val != 0) tty.output.push(val);
}
},flush:function (tty) {
if (tty.output && tty.output.length > 0) {
Module['printErr'](UTF8ArrayToString(tty.output, 0));
tty.output = [];
}
}}};
var MEMFS={ops_table:null,mount:function (mount) {
return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);
},createNode:function (parent, name, mode, dev) {
if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
// no supported
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}
if (!MEMFS.ops_table) {
MEMFS.ops_table = {
dir: {
node: {
getattr: MEMFS.node_ops.getattr,
setattr: MEMFS.node_ops.setattr,
lookup: MEMFS.node_ops.lookup,
mknod: MEMFS.node_ops.mknod,
rename: MEMFS.node_ops.rename,
unlink: MEMFS.node_ops.unlink,
rmdir: MEMFS.node_ops.rmdir,
readdir: MEMFS.node_ops.readdir,
symlink: MEMFS.node_ops.symlink
},
stream: {
llseek: MEMFS.stream_ops.llseek
}
},
file: {
node: {
getattr: MEMFS.node_ops.getattr,
setattr: MEMFS.node_ops.setattr
},
stream: {
llseek: MEMFS.stream_ops.llseek,
read: MEMFS.stream_ops.read,
write: MEMFS.stream_ops.write,
allocate: MEMFS.stream_ops.allocate,
mmap: MEMFS.stream_ops.mmap,
msync: MEMFS.stream_ops.msync
}
},
link: {
node: {
getattr: MEMFS.node_ops.getattr,
setattr: MEMFS.node_ops.setattr,
readlink: MEMFS.node_ops.readlink
},
stream: {}
},
chrdev: {
node: {
getattr: MEMFS.node_ops.getattr,
setattr: MEMFS.node_ops.setattr
},
stream: FS.chrdev_stream_ops
}
};
}
var node = FS.createNode(parent, name, mode, dev);
if (FS.isDir(node.mode)) {
node.node_ops = MEMFS.ops_table.dir.node;
node.stream_ops = MEMFS.ops_table.dir.stream;
node.contents = {};
} else if (FS.isFile(node.mode)) {
node.node_ops = MEMFS.ops_table.file.node;
node.stream_ops = MEMFS.ops_table.file.stream;
node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity.
// When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred
// for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size
// penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme.
node.contents = null;
} else if (FS.isLink(node.mode)) {
node.node_ops = MEMFS.ops_table.link.node;
node.stream_ops = MEMFS.ops_table.link.stream;
} else if (FS.isChrdev(node.mode)) {
node.node_ops = MEMFS.ops_table.chrdev.node;
node.stream_ops = MEMFS.ops_table.chrdev.stream;
}
node.timestamp = Date.now();
// add the new node to the parent
if (parent) {
parent.contents[name] = node;
}
return node;
},getFileDataAsRegularArray:function (node) {
if (node.contents && node.contents.subarray) {
var arr = [];
for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]);
return arr; // Returns a copy of the original data.
}
return node.contents; // No-op, the file contents are already in a JS array. Return as-is.
},getFileDataAsTypedArray:function (node) {
if (!node.contents) return new Uint8Array;
if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes.
return new Uint8Array(node.contents);
},expandFileStorage:function (node, newCapacity) {
// If we are asked to expand the size of a file that already exists, revert to using a standard JS array to store the file
// instead of a typed array. This makes resizing the array more flexible because we can just .push() elements at the back to
// increase the size.
if (node.contents && node.contents.subarray && newCapacity > node.contents.length) {
node.contents = MEMFS.getFileDataAsRegularArray(node);
node.usedBytes = node.contents.length; // We might be writing to a lazy-loaded file which had overridden this property, so force-reset it.
}
if (!node.contents || node.contents.subarray) { // Keep using a typed array if creating a new storage, or if old one was a typed array as well.
var prevCapacity = node.contents ? node.contents.length : 0;
if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough.
// Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity.
// For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to
// avoid overshooting the allocation cap by a very large margin.
var CAPACITY_DOUBLING_MAX = 1024 * 1024;
newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) | 0);
if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding.
var oldContents = node.contents;
node.contents = new Uint8Array(newCapacity); // Allocate new storage.
if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage.
return;
}
// Not using a typed array to back the file storage. Use a standard JS array instead.
if (!node.contents && newCapacity > 0) node.contents = [];
while (node.contents.length < newCapacity) node.contents.push(0);
},resizeFileStorage:function (node, newSize) {
if (node.usedBytes == newSize) return;
if (newSize == 0) {
node.contents = null; // Fully decommit when requesting a resize to zero.
node.usedBytes = 0;
return;
}
if (!node.contents || node.contents.subarray) { // Resize a typed array if that is being used as the backing store.
var oldContents = node.contents;
node.contents = new Uint8Array(new ArrayBuffer(newSize)); // Allocate new storage.
if (oldContents) {
node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage.
}
node.usedBytes = newSize;
return;
}
// Backing with a JS array.
if (!node.contents) node.contents = [];
if (node.contents.length > newSize) node.contents.length = newSize;
else while (node.contents.length < newSize) node.contents.push(0);
node.usedBytes = newSize;
},node_ops:{getattr:function (node) {
var attr = {};
// device numbers reuse inode numbers.
attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
attr.ino = node.id;
attr.mode = node.mode;
attr.nlink = 1;
attr.uid = 0;
attr.gid = 0;
attr.rdev = node.rdev;
if (FS.isDir(node.mode)) {
attr.size = 4096;
} else if (FS.isFile(node.mode)) {
attr.size = node.usedBytes;
} else if (FS.isLink(node.mode)) {
attr.size = node.link.length;
} else {
attr.size = 0;
}
attr.atime = new Date(node.timestamp);
attr.mtime = new Date(node.timestamp);
attr.ctime = new Date(node.timestamp);
// NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),
// but this is not required by the standard.
attr.blksize = 4096;
attr.blocks = Math.ceil(attr.size / attr.blksize);
return attr;
},setattr:function (node, attr) {
if (attr.mode !== undefined) {
node.mode = attr.mode;
}
if (attr.timestamp !== undefined) {
node.timestamp = attr.timestamp;
}
if (attr.size !== undefined) {
MEMFS.resizeFileStorage(node, attr.size);
}
},lookup:function (parent, name) {
throw FS.genericErrors[ERRNO_CODES.ENOENT];
},mknod:function (parent, name, mode, dev) {
return MEMFS.createNode(parent, name, mode, dev);
},rename:function (old_node, new_dir, new_name) {
// if we're overwriting a directory at new_name, make sure it's empty.
if (FS.isDir(old_node.mode)) {
var new_node;
try {
new_node = FS.lookupNode(new_dir, new_name);
} catch (e) {
}
if (new_node) {
for (var i in new_node.contents) {
throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
}
}
}
// do the internal rewiring
delete old_node.parent.contents[old_node.name];
old_node.name = new_name;
new_dir.contents[new_name] = old_node;
old_node.parent = new_dir;
},unlink:function (parent, name) {
delete parent.contents[name];
},rmdir:function (parent, name) {
var node = FS.lookupNode(parent, name);
for (var i in node.contents) {
throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
}
delete parent.contents[name];
},readdir:function (node) {
var entries = ['.', '..']
for (var key in node.contents) {
if (!node.contents.hasOwnProperty(key)) {
continue;
}
entries.push(key);
}
return entries;
},symlink:function (parent, newname, oldpath) {
var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0);
node.link = oldpath;
return node;
},readlink:function (node) {
if (!FS.isLink(node.mode)) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
return node.link;
}},stream_ops:{read:function (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);
assert(size >= 0);
if (size > 8 && contents.subarray) { // non-trivial, and typed array
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:function (stream, buffer, offset, length, position, canOwn) {
if (!length) return 0;
var node = stream.node;
node.timestamp = Date.now();
if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array?
if (canOwn) {
node.contents = buffer.subarray(offset, offset + length);
node.usedBytes = length;
return length;
} else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data.
node.contents = new Uint8Array(buffer.subarray(offset, offset + length));
node.usedBytes = length;
return length;
} else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file?
node.contents.set(buffer.subarray(offset, offset + length), position);
return length;
}
}
// Appending to an existing file and we need to reallocate, or source data did not come as a typed array.
MEMFS.expandFileStorage(node, position+length);
if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position); // Use typed array write if available.
else {
for (var i = 0; i < length; i++) {
node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not.
}
}
node.usedBytes = Math.max(node.usedBytes, position+length);
return length;
},llseek:function (stream, offset, whence) {
var position = offset;
if (whence === 1) { // SEEK_CUR.
position += stream.position;
} else if (whence === 2) { // SEEK_END.
if (FS.isFile(stream.node.mode)) {
position += stream.node.usedBytes;
}
}
if (position < 0) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
return position;
},allocate:function (stream, offset, length) {
MEMFS.expandFileStorage(stream.node, offset + length);
stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length);
},mmap:function (stream, buffer, offset, length, position, prot, flags) {
if (!FS.isFile(stream.node.mode)) {
throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
}
var ptr;
var allocated;
var contents = stream.node.contents;
// Only make a new copy when MAP_PRIVATE is specified.
if ( !(flags & 2) &&
(contents.buffer === buffer || contents.buffer === buffer.buffer) ) {
// We can't emulate MAP_SHARED when the file is not backed by the buffer
// we're mapping to (e.g. the HEAP buffer).
allocated = false;
ptr = contents.byteOffset;
} else {
// Try to avoid unnecessary slices.
if (position > 0 || position + length < stream.node.usedBytes) {
if (contents.subarray) {
contents = contents.subarray(position, position + length);
} else {
contents = Array.prototype.slice.call(contents, position, position + length);
}
}
allocated = true;
ptr = _malloc(length);
if (!ptr) {
throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);
}
buffer.set(contents, ptr);
}
return { ptr: ptr, allocated: allocated };
},msync:function (stream, buffer, offset, length, mmapFlags) {
if (!FS.isFile(stream.node.mode)) {
throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
}
if (mmapFlags & 2) {
// MAP_PRIVATE calls need not to be synced back to underlying fs
return 0;
}
var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false);
// should we check if bytesWritten and length are the same?
return 0;
}}};
var IDBFS={dbs:{},indexedDB:function () {
return Module.indexedDB;
},DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function (mount) {
// reuse all of the core MEMFS functionality
return MEMFS.mount.apply(null, arguments);
},syncfs:function (mount, populate, callback) {
IDBFS.getLocalSet(mount, function(err, local) {
if (err) return callback(err);
IDBFS.getRemoteSet(mount, function(err, remote) {
if (err) return callback(err);
var src = populate ? remote : local;
var dst = populate ? local : remote;
IDBFS.reconcile(src, dst, callback);
});
});
},getDB:function (name, callback) {
// check the cache first
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 = function(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 = function() {
db = req.result;
// add to the cache
IDBFS.dbs[name] = db;
callback(null, db);
};
req.onerror = function(e) {
callback(this.error);
e.preventDefault();
};
},getLocalSet:function (mount, callback) {
var entries = {};
function isRealDir(p) {
return p !== '.' && p !== '..';
};
function toAbsolute(root) {
return function(p) {
return 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.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));
}
entries[path] = { timestamp: stat.mtime };
}
return callback(null, { type: 'local', entries: entries });
},getRemoteSet:function (mount, callback) {
var entries = {};
IDBFS.getDB(mount.mountpoint, function(err, db) {
if (err) return callback(err);
var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');
transaction.onerror = function(e) {
callback(this.error);
e.preventDefault();
};
var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
var index = store.index('timestamp');
index.openKeyCursor().onsuccess = function(event) {
var cursor = event.target.result;
if (!cursor) {
return callback(null, { type: 'remote', db: db, entries: entries });
}
entries[cursor.primaryKey] = { timestamp: cursor.key };
cursor.continue();
};
});
},loadLocalEntry:function (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)) {
// Performance consideration: storing a normal JavaScript array to a IndexedDB is much slower than storing a typed array.
// Therefore always convert the file contents to a typed array first before writing the data to IndexedDB.
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:function (path, entry, callback) {
try {
if (FS.isDir(entry.mode)) {
FS.mkdir(path, entry.mode);
} else if (FS.isFile(entry.mode)) {
FS.writeFile(path, entry.contents, { encoding: 'binary', 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:function (path, callback) {
try {
var lookup = FS.lookupPath(path);
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:function (store, path, callback) {
var req = store.get(path);
req.onsuccess = function(event) { callback(null, event.target.result); };
req.onerror = function(e) {
callback(this.error);
e.preventDefault();
};
},storeRemoteEntry:function (store, path, entry, callback) {
var req = store.put(entry, path);
req.onsuccess = function() { callback(null); };
req.onerror = function(e) {
callback(this.error);
e.preventDefault();
};
},removeRemoteEntry:function (store, path, callback) {
var req = store.delete(path);
req.onsuccess = function() { callback(null); };
req.onerror = function(e) {
callback(this.error);
e.preventDefault();
};
},reconcile:function (src, dst, callback) {
var total = 0;
var create = [];
Object.keys(src.entries).forEach(function (key) {
var e = src.entries[key];
var e2 = dst.entries[key];
if (!e2 || e.timestamp > e2.timestamp) {
create.push(key);
total++;
}
});
var remove = [];
Object.keys(dst.entries).forEach(function (key) {
var e = dst.entries[key];
var e2 = src.entries[key];
if (!e2) {
remove.push(key);
total++;
}
});
if (!total) {
return callback(null);
}
var errored = false;
var completed = 0;
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) {
if (!done.errored) {
done.errored = true;
return callback(err);
}
return;
}
if (++completed >= total) {
return callback(null);
}
};
transaction.onerror = function(e) {
done(this.error);
e.preventDefault();
};
// sort paths in ascending order so directory entries are created
// before the files inside them
create.sort().forEach(function (path) {
if (dst.type === 'local') {
IDBFS.loadRemoteEntry(store, path, function (err, entry) {
if (err) return done(err);
IDBFS.storeLocalEntry(path, entry, done);
});
} else {
IDBFS.loadLocalEntry(path, function (err, entry) {
if (err) return done(err);
IDBFS.storeRemoteEntry(store, path, entry, done);
});
}
});
// sort paths in descending order so files are deleted before their
// parent directories
remove.sort().reverse().forEach(function(path) {
if (dst.type === 'local') {
IDBFS.removeLocalEntry(path, done);
} else {
IDBFS.removeRemoteEntry(store, path, done);
}
});
}};
var NODEFS={isWindows:false,staticInit:function () {
NODEFS.isWindows = !!process.platform.match(/^win/);
},mount:function (mount) {
assert(ENVIRONMENT_IS_NODE);
return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);
},createNode:function (parent, name, mode, dev) {
if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
var node = FS.createNode(parent, name, mode);
node.node_ops = NODEFS.node_ops;
node.stream_ops = NODEFS.stream_ops;
return node;
},getMode:function (path) {
var stat;
try {
stat = fs.lstatSync(path);
if (NODEFS.isWindows) {
// On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so
// propagate write bits to execute bits.
stat.mode = stat.mode | ((stat.mode & 146) >> 1);
}
} catch (e) {
if (!e.code) throw e;
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
return stat.mode;
},realPath:function (node) {
var parts = [];
while (node.parent !== node) {
parts.push(node.name);
node = node.parent;
}
parts.push(node.mount.opts.root);
parts.reverse();
return PATH.join.apply(null, parts);
},flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:function (flags) {
flags &= ~0x200000 /*O_PATH*/; // Ignore this flag from musl, otherwise node.js fails to open the file.
flags &= ~0x800 /*O_NONBLOCK*/; // Ignore this flag from musl, otherwise node.js fails to open the file.
flags &= ~0x8000 /*O_LARGEFILE*/; // Ignore this flag from musl, otherwise node.js fails to open the file.
flags &= ~0x80000 /*O_CLOEXEC*/; // Some applications may pass it; it makes no sense for a single process.
if (flags in NODEFS.flagsToPermissionStringMap) {
return NODEFS.flagsToPermissionStringMap[flags];
} else {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
},node_ops:{getattr:function (node) {
var path = NODEFS.realPath(node);
var stat;
try {
stat = fs.lstatSync(path);
} catch (e) {
if (!e.code) throw e;
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
// node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.
// See http://support.microsoft.com/kb/140365
if (NODEFS.isWindows && !stat.blksize) {
stat.blksize = 4096;
}
if (NODEFS.isWindows && !stat.blocks) {
stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;
}
return {
dev: stat.dev,
ino: stat.ino,
mode: stat.mode,
nlink: stat.nlink,
uid: stat.uid,
gid: stat.gid,
rdev: stat.rdev,
size: stat.size,
atime: stat.atime,
mtime: stat.mtime,
ctime: stat.ctime,
blksize: stat.blksize,
blocks: stat.blocks
};
},setattr:function (node, attr) {
var path = NODEFS.realPath(node);
try {
if (attr.mode !== undefined) {
fs.chmodSync(path, attr.mode);
// update the common node structure mode as well
node.mode = attr.mode;
}
if (attr.timestamp !== undefined) {
var date = new Date(attr.timestamp);
fs.utimesSync(path, date, date);
}
if (attr.size !== undefined) {
fs.truncateSync(path, attr.size);
}
} catch (e) {
if (!e.code) throw e;
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
},lookup:function (parent, name) {
var path = PATH.join2(NODEFS.realPath(parent), name);
var mode = NODEFS.getMode(path);
return NODEFS.createNode(parent, name, mode);
},mknod:function (parent, name, mode, dev) {
var node = NODEFS.createNode(parent, name, mode, dev);
// create the backing node for this in the fs root as well
var path = NODEFS.realPath(node);
try {
if (FS.isDir(node.mode)) {
fs.mkdirSync(path, node.mode);
} else {
fs.writeFileSync(path, '', { mode: node.mode });
}
} catch (e) {
if (!e.code) throw e;
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
return node;
},rename:function (oldNode, newDir, newName) {
var oldPath = NODEFS.realPath(oldNode);
var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
try {
fs.renameSync(oldPath, newPath);
} catch (e) {
if (!e.code) throw e;
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
},unlink:function (parent, name) {
var path = PATH.join2(NODEFS.realPath(parent), name);
try {
fs.unlinkSync(path);
} catch (e) {
if (!e.code) throw e;
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
},rmdir:function (parent, name) {
var path = PATH.join2(NODEFS.realPath(parent), name);
try {
fs.rmdirSync(path);
} catch (e) {
if (!e.code) throw e;
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
},readdir:function (node) {
var path = NODEFS.realPath(node);
try {
return fs.readdirSync(path);
} catch (e) {
if (!e.code) throw e;
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
},symlink:function (parent, newName, oldPath) {
var newPath = PATH.join2(NODEFS.realPath(parent), newName);
try {
fs.symlinkSync(oldPath, newPath);
} catch (e) {
if (!e.code) throw e;
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
},readlink:function (node) {
var path = NODEFS.realPath(node);
try {
path = fs.readlinkSync(path);
path = NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root), path);
return path;
} catch (e) {
if (!e.code) throw e;
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
}},stream_ops:{open:function (stream) {
var path = NODEFS.realPath(stream.node);
try {
if (FS.isFile(stream.node.mode)) {
stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));
}
} catch (e) {
if (!e.code) throw e;
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
},close:function (stream) {
try {
if (FS.isFile(stream.node.mode) && stream.nfd) {
fs.closeSync(stream.nfd);
}
} catch (e) {
if (!e.code) throw e;
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
},read:function (stream, buffer, offset, length, position) {
if (length === 0) return 0; // node errors on 0 length reads
// FIXME this is terrible.
var nbuffer = new Buffer(length);
var res;
try {
res = fs.readSync(stream.nfd, nbuffer, 0, length, position);
} catch (e) {
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
if (res > 0) {
for (var i = 0; i < res; i++) {
buffer[offset + i] = nbuffer[i];
}
}
return res;
},write:function (stream, buffer, offset, length, position) {
// FIXME this is terrible.
var nbuffer = new Buffer(buffer.subarray(offset, offset + length));
var res;
try {
res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);
} catch (e) {
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
return res;
},llseek:function (stream, offset, whence) {
var position = offset;
if (whence === 1) { // SEEK_CUR.
position += stream.position;
} else if (whence === 2) { // SEEK_END.
if (FS.isFile(stream.node.mode)) {
try {
var stat = fs.fstatSync(stream.nfd);
position += stat.size;
} catch (e) {
throw new FS.ErrnoError(ERRNO_CODES[e.code]);
}
}
}
if (position < 0) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
return position;
}}};
var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:function (mount) {
assert(ENVIRONMENT_IS_WORKER);
if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync();
var root = WORKERFS.createNode(null, '/', WORKERFS.DIR_MODE, 0);
var createdParents = {};
function ensureParent(path) {
// return the parent node, creating subdirs as necessary
var parts = path.split('/');
var parent = root;
for (var i = 0; i < parts.length-1; i++) {
var curr = parts.slice(0, i+1).join('/');
// Issue 4254: Using curr as a node name will prevent the node
// from being found in FS.nameTable when FS.open is called on
// a path which holds a child of this node,
// given that all FS functions assume node names
// are just their corresponding parts within their given path,
// rather than incremental aggregates which include their parent's
// directories.
if (!createdParents[curr]) {
createdParents[curr] = WORKERFS.createNode(parent, parts[i], WORKERFS.DIR_MODE, 0);
}
parent = createdParents[curr];
}
return parent;
}
function base(path) {
var parts = path.split('/');
return parts[parts.length-1];
}
// We also accept FileList here, by using Array.prototype
Array.prototype.forEach.call(mount.opts["files"] || [], function(file) {
WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate);
});
(mount.opts["blobs"] || []).forEach(function(obj) {
WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"]);
});
(mount.opts["packages"] || []).forEach(function(pack) {
pack['metadata'].files.forEach(function(file) {
var name = file.filename.substr(1); // remove initial slash
WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack['blob'].slice(file.start, file.end));
});
});
return root;
},createNode:function (parent, name, mode, dev, contents, mtime) {
var node = FS.createNode(parent, name, mode);
node.mode = mode;
node.node_ops = WORKERFS.node_ops;
node.stream_ops = WORKERFS.stream_ops;
node.timestamp = (mtime || new Date).getTime();
assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE);
if (mode === WORKERFS.FILE_MODE) {
node.size = contents.size;
node.contents = contents;
} else {
node.size = 4096;
node.contents = {};
}
if (parent) {
parent.contents[name] = node;
}
return node;
},node_ops:{getattr:function (node) {
return {
dev: 1,
ino: undefined,
mode: node.mode,
nlink: 1,
uid: 0,
gid: 0,
rdev: undefined,
size: node.size,
atime: new Date(node.timestamp),
mtime: new Date(node.timestamp),
ctime: new Date(node.timestamp),
blksize: 4096,
blocks: Math.ceil(node.size / 4096),
};
},setattr:function (node, attr) {
if (attr.mode !== undefined) {
node.mode = attr.mode;
}
if (attr.timestamp !== undefined) {
node.timestamp = attr.timestamp;
}
},lookup:function (parent, name) {
throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
},mknod:function (parent, name, mode, dev) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
},rename:function (oldNode, newDir, newName) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
},unlink:function (parent, name) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
},rmdir:function (parent, name) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
},readdir:function (node) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
},symlink:function (parent, newName, oldPath) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
},readlink:function (node) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}},stream_ops:{read:function (stream, buffer, offset, length, position) {
if (position >= stream.node.size) return 0;
var chunk = stream.node.contents.slice(position, position + length);
var ab = WORKERFS.reader.readAsArrayBuffer(chunk);
buffer.set(new Uint8Array(ab), offset);
return chunk.size;
},write:function (stream, buffer, offset, length, position) {
throw new FS.ErrnoError(ERRNO_CODES.EIO);
},llseek:function (stream, offset, whence) {
var position = offset;
if (whence === 1) { // SEEK_CUR.
position += stream.position;
} else if (whence === 2) { // SEEK_END.
if (FS.isFile(stream.node.mode)) {
position += stream.node.size;
}
}
if (position < 0) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
return position;
}}};
var _stdin=STATICTOP; STATICTOP += 16;;
var _stdout=STATICTOP; STATICTOP += 16;;
var _stderr=STATICTOP; STATICTOP += 16;;var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:function (e) {
if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();
return ___setErrNo(e.errno);
},lookupPath:function (path, opts) {
path = PATH.resolve(FS.cwd(), path);
opts = opts || {};
if (!path) return { path: '', node: null };
var defaults = {
follow_mount: true,
recurse_count: 0
};
for (var key in defaults) {
if (opts[key] === undefined) {
opts[key] = defaults[key];
}
}
if (opts.recurse_count > 8) { // max recursive lookup of 8
throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
}
// split the path
var parts = PATH.normalizeArray(path.split('/').filter(function(p) {
return !!p;
}), false);
// start at the root
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) {
// stop resolving
break;
}
current = FS.lookupNode(current, parts[i]);
current_path = PATH.join2(current_path, parts[i]);
// jump to the mount's root node if this is a mountpoint
if (FS.isMountpoint(current)) {
if (!islast || (islast && opts.follow_mount)) {
current = current.mounted.root;
}
}
// by default, lookupPath will not follow a symlink if it is the final path component.
// setting opts.follow = true will override this behavior.
if (!islast || opts.follow) {
var count = 0;
while (FS.isLink(current.mode)) {
var link = FS.readlink(current_path);
current_path = PATH.resolve(PATH.dirname(current_path), link);
var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });
current = lookup.node;
if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX).
throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
}
}
}
}
return { path: current_path, node: current };
},getPath:function (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:function (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:function (node) {
var hash = FS.hashName(node.parent.id, node.name);
node.name_next = FS.nameTable[hash];
FS.nameTable[hash] = node;
},hashRemoveNode:function (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:function (parent, name) {
var err = FS.mayLookup(parent);
if (err) {
throw new FS.ErrnoError(err, parent);
}
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;
}
}
// if we failed to find it in the cache, call into the VFS
return FS.lookup(parent, name);
},createNode:function (parent, name, mode, rdev) {
if (!FS.FSNode) {
FS.FSNode = function(parent, name, mode, rdev) {
if (!parent) {
parent = this; // root node sets parent to itself
}
this.parent = parent;
this.mount = parent.mount;
this.mounted = null;
this.id = FS.nextInode++;
this.name = name;
this.mode = mode;
this.node_ops = {};
this.stream_ops = {};
this.rdev = rdev;
};
FS.FSNode.prototype = {};
// compatibility
var readMode = 292 | 73;
var writeMode = 146;
// NOTE we must use Object.defineProperties instead of individual calls to
// Object.defineProperty in order to make closure compiler happy
Object.defineProperties(FS.FSNode.prototype, {
read: {
get: function() { return (this.mode & readMode) === readMode; },
set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }
},
write: {
get: function() { return (this.mode & writeMode) === writeMode; },
set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }
},
isFolder: {
get: function() { return FS.isDir(this.mode); }
},
isDevice: {
get: function() { return FS.isChrdev(this.mode); }
}
});
}
var node = new FS.FSNode(parent, name, mode, rdev);
FS.hashAddNode(node);
return node;
},destroyNode:function (node) {
FS.hashRemoveNode(node);
},isRoot:function (node) {
return node === node.parent;
},isMountpoint:function (node) {
return !!node.mounted;
},isFile:function (mode) {
return (mode & 61440) === 32768;
},isDir:function (mode) {
return (mode & 61440) === 16384;
},isLink:function (mode) {
return (mode & 61440) === 40960;
},isChrdev:function (mode) {
return (mode & 61440) === 8192;
},isBlkdev:function (mode) {
return (mode & 61440) === 24576;
},isFIFO:function (mode) {
return (mode & 61440) === 4096;
},isSocket:function (mode) {
return (mode & 49152) === 49152;
},flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function (str) {
var flags = FS.flagModes[str];
if (typeof flags === 'undefined') {
throw new Error('Unknown file open mode: ' + str);
}
return flags;
},flagsToPermissionString:function (flag) {
var perms = ['r', 'w', 'rw'][flag & 3];
if ((flag & 512)) {
perms += 'w';
}
return perms;
},nodePermissions:function (node, perms) {
if (FS.ignorePermissions) {
return 0;
}
// return 0 if any user, group or owner bits are set.
if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {
return ERRNO_CODES.EACCES;
} else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {
return ERRNO_CODES.EACCES;
} else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {
return ERRNO_CODES.EACCES;
}
return 0;
},mayLookup:function (dir) {
var err = FS.nodePermissions(dir, 'x');
if (err) return err;
if (!dir.node_ops.lookup) return ERRNO_CODES.EACCES;
return 0;
},mayCreate:function (dir, name) {
try {
var node = FS.lookupNode(dir, name);
return ERRNO_CODES.EEXIST;
} catch (e) {
}
return FS.nodePermissions(dir, 'wx');
},mayDelete:function (dir, name, isdir) {
var node;
try {
node = FS.lookupNode(dir, name);
} catch (e) {
return e.errno;
}
var err = FS.nodePermissions(dir, 'wx');
if (err) {
return err;
}
if (isdir) {
if (!FS.isDir(node.mode)) {
return ERRNO_CODES.ENOTDIR;
}
if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
return ERRNO_CODES.EBUSY;
}
} else {
if (FS.isDir(node.mode)) {
return ERRNO_CODES.EISDIR;
}
}
return 0;
},mayOpen:function (node, flags) {
if (!node) {
return ERRNO_CODES.ENOENT;
}
if (FS.isLink(node.mode)) {
return ERRNO_CODES.ELOOP;
} else if (FS.isDir(node.mode)) {
if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write
(flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only)
return ERRNO_CODES.EISDIR;
}
}
return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
},MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {
fd_start = fd_start || 0;
fd_end = fd_end || FS.MAX_OPEN_FDS;
for (var fd = fd_start; fd <= fd_end; fd++) {
if (!FS.streams[fd]) {
return fd;
}
}
throw new FS.ErrnoError(ERRNO_CODES.EMFILE);
},getStream:function (fd) {
return FS.streams[fd];
},createStream:function (stream, fd_start, fd_end) {
if (!FS.FSStream) {
FS.FSStream = function(){};
FS.FSStream.prototype = {};
// compatibility
Object.defineProperties(FS.FSStream.prototype, {
object: {
get: function() { return this.node; },
set: function(val) { this.node = val; }
},
isRead: {
get: function() { return (this.flags & 2097155) !== 1; }
},
isWrite: {
get: function() { return (this.flags & 2097155) !== 0; }
},
isAppend: {
get: function() { return (this.flags & 1024); }
}
});
}
// clone it, so we can return an instance of FSStream
var newStream = new FS.FSStream();
for (var p in stream) {
newStream[p] = stream[p];
}
stream = newStream;
var fd = FS.nextfd(fd_start, fd_end);
stream.fd = fd;
FS.streams[fd] = stream;
return stream;
},closeStream:function (fd) {
FS.streams[fd] = null;
},chrdev_stream_ops:{open:function (stream) {
var device = FS.getDevice(stream.node.rdev);
// override node's stream ops with the device's
stream.stream_ops = device.stream_ops;
// forward the open call
if (stream.stream_ops.open) {
stream.stream_ops.open(stream);
}
},llseek:function () {
throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
}},major:function (dev) {
return ((dev) >> 8);
},minor:function (dev) {
return ((dev) & 0xff);
},makedev:function (ma, mi) {
return ((ma) << 8 | (mi));
},registerDevice:function (dev, ops) {
FS.devices[dev] = { stream_ops: ops };
},getDevice:function (dev) {
return FS.devices[dev];
},getMounts:function (mount) {
var mounts = [];
var check = [mount];
while (check.length) {
var m = check.pop();
mounts.push(m);
check.push.apply(check, m.mounts);
}
return mounts;
},syncfs:function (populate, callback) {
if (typeof(populate) === 'function') {
callback = populate;
populate = false;
}
FS.syncFSRequests++;
if (FS.syncFSRequests > 1) {
console.log('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(err) {
assert(FS.syncFSRequests > 0);
FS.syncFSRequests--;
return callback(err);
}
function done(err) {
if (err) {
if (!done.errored) {
done.errored = true;
return doCallback(err);
}
return;
}
if (++completed >= mounts.length) {
doCallback(null);
}
};
// sync all mounts
mounts.forEach(function (mount) {
if (!mount.type.syncfs) {
return done(null);
}
mount.type.syncfs(mount, populate, done);
});
},mount:function (type, opts, mountpoint) {
var root = mountpoint === '/';
var pseudo = !mountpoint;
var node;
if (root && FS.root) {
throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
} else if (!root && !pseudo) {
var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
mountpoint = lookup.path; // use the absolute path
node = lookup.node;
if (FS.isMountpoint(node)) {
throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
}
if (!FS.isDir(node.mode)) {
throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
}
}
var mount = {
type: type,
opts: opts,
mountpoint: mountpoint,
mounts: []
};
// create a root node for the fs
var mountRoot = type.mount(mount);
mountRoot.mount = mount;
mount.root = mountRoot;
if (root) {
FS.root = mountRoot;
} else if (node) {
// set as a mountpoint
node.mounted = mount;
// add the new mount to the current mount's children
if (node.mount) {
node.mount.mounts.push(mount);
}
}
return mountRoot;
},unmount:function (mountpoint) {
var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
if (!FS.isMountpoint(lookup.node)) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
// destroy the nodes for this mount, and all its child mounts
var node = lookup.node;
var mount = node.mounted;
var mounts = FS.getMounts(mount);
Object.keys(FS.nameTable).forEach(function (hash) {
var current = FS.nameTable[hash];
while (current) {
var next = current.name_next;
if (mounts.indexOf(current.mount) !== -1) {
FS.destroyNode(current);
}
current = next;
}
});
// no longer a mountpoint
node.mounted = null;
// remove this mount from the child mounts
var idx = node.mount.mounts.indexOf(mount);
assert(idx !== -1);
node.mount.mounts.splice(idx, 1);
},lookup:function (parent, name) {
return parent.node_ops.lookup(parent, name);
},mknod:function (path, mode, dev) {
var lookup = FS.lookupPath(path, { parent: true });
var parent = lookup.node;
var name = PATH.basename(path);
if (!name || name === '.' || name === '..') {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
var err = FS.mayCreate(parent, name);
if (err) {
throw new FS.ErrnoError(err);
}
if (!parent.node_ops.mknod) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}
return parent.node_ops.mknod(parent, name, mode, dev);
},create:function (path, mode) {
mode = mode !== undefined ? mode : 438 /* 0666 */;
mode &= 4095;
mode |= 32768;
return FS.mknod(path, mode, 0);
},mkdir:function (path, mode) {
mode = mode !== undefined ? mode : 511 /* 0777 */;
mode &= 511 | 512;
mode |= 16384;
return FS.mknod(path, mode, 0);
},mkdirTree:function (path, mode) {
var dirs = path.split('/');
var d = '';
for (var i = 0; i < dirs.length; ++i) {
if (!dirs[i]) continue;
d += '/' + dirs[i];
try {
FS.mkdir(d, mode);
} catch(e) {
if (e.errno != ERRNO_CODES.EEXIST) throw e;
}
}
},mkdev:function (path, mode, dev) {
if (typeof(dev) === 'undefined') {
dev = mode;
mode = 438 /* 0666 */;
}
mode |= 8192;
return FS.mknod(path, mode, dev);
},symlink:function (oldpath, newpath) {
if (!PATH.resolve(oldpath)) {
throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
}
var lookup = FS.lookupPath(newpath, { parent: true });
var parent = lookup.node;
if (!parent) {
throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
}
var newname = PATH.basename(newpath);
var err = FS.mayCreate(parent, newname);
if (err) {
throw new FS.ErrnoError(err);
}
if (!parent.node_ops.symlink) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}
return parent.node_ops.symlink(parent, newname, oldpath);
},rename:function (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);
// parents must exist
var lookup, old_dir, new_dir;
try {
lookup = FS.lookupPath(old_path, { parent: true });
old_dir = lookup.node;
lookup = FS.lookupPath(new_path, { parent: true });
new_dir = lookup.node;
} catch (e) {
throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
}
if (!old_dir || !new_dir) throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
// need to be part of the same mount
if (old_dir.mount !== new_dir.mount) {
throw new FS.ErrnoError(ERRNO_CODES.EXDEV);
}
// source must exist
var old_node = FS.lookupNode(old_dir, old_name);
// old path should not be an ancestor of the new path
var relative = PATH.relative(old_path, new_dirname);
if (relative.charAt(0) !== '.') {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
// new path should not be an ancestor of the old path
relative = PATH.relative(new_path, old_dirname);
if (relative.charAt(0) !== '.') {
throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
}
// see if the new path already exists
var new_node;
try {
new_node = FS.lookupNode(new_dir, new_name);
} catch (e) {
// not fatal
}
// early out if nothing needs to change
if (old_node === new_node) {
return;
}
// we'll need to delete the old entry
var isdir = FS.isDir(old_node.mode);
var err = FS.mayDelete(old_dir, old_name, isdir);
if (err) {
throw new FS.ErrnoError(err);
}
// need delete permissions if we'll be overwriting.
// need create permissions if new doesn't already exist.
err = new_node ?
FS.mayDelete(new_dir, new_name, isdir) :
FS.mayCreate(new_dir, new_name);
if (err) {
throw new FS.ErrnoError(err);
}
if (!old_dir.node_ops.rename) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}
if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {
throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
}
// if we are going to change the parent, check write permissions
if (new_dir !== old_dir) {
err = FS.nodePermissions(old_dir, 'w');
if (err) {
throw new FS.ErrnoError(err);
}
}
try {
if (FS.trackingDelegate['willMovePath']) {
FS.trackingDelegate['willMovePath'](old_path, new_path);
}
} catch(e) {
console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message);
}
// remove the node from the lookup hash
FS.hashRemoveNode(old_node);
// do the underlying fs rename
try {
old_dir.node_ops.rename(old_node, new_dir, new_name);
} catch (e) {
throw e;
} finally {
// add the node back to the hash (in case node_ops.rename
// changed its name)
FS.hashAddNode(old_node);
}
try {
if (FS.trackingDelegate['onMovePath']) FS.trackingDelegate['onMovePath'](old_path, new_path);
} catch(e) {
console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message);
}
},rmdir:function (path) {
var lookup = FS.lookupPath(path, { parent: true });
var parent = lookup.node;
var name = PATH.basename(path);
var node = FS.lookupNode(parent, name);
var err = FS.mayDelete(parent, name, true);
if (err) {
throw new FS.ErrnoError(err);
}
if (!parent.node_ops.rmdir) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}
if (FS.isMountpoint(node)) {
throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
}
try {
if (FS.trackingDelegate['willDeletePath']) {
FS.trackingDelegate['willDeletePath'](path);
}
} catch(e) {
console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message);
}
parent.node_ops.rmdir(parent, name);
FS.destroyNode(node);
try {
if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path);
} catch(e) {
console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message);
}
},readdir:function (path) {
var lookup = FS.lookupPath(path, { follow: true });
var node = lookup.node;
if (!node.node_ops.readdir) {
throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
}
return node.node_ops.readdir(node);
},unlink:function (path) {
var lookup = FS.lookupPath(path, { parent: true });
var parent = lookup.node;
var name = PATH.basename(path);
var node = FS.lookupNode(parent, name);
var err = FS.mayDelete(parent, name, false);
if (err) {
// According to POSIX, we should map EISDIR to EPERM, but
// we instead do what Linux does (and we must, as we use
// the musl linux libc).
throw new FS.ErrnoError(err);
}
if (!parent.node_ops.unlink) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}
if (FS.isMountpoint(node)) {
throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
}
try {
if (FS.trackingDelegate['willDeletePath']) {
FS.trackingDelegate['willDeletePath'](path);
}
} catch(e) {
console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message);
}
parent.node_ops.unlink(parent, name);
FS.destroyNode(node);
try {
if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path);
} catch(e) {
console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message);
}
},readlink:function (path) {
var lookup = FS.lookupPath(path);
var link = lookup.node;
if (!link) {
throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
}
if (!link.node_ops.readlink) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link));
},stat:function (path, dontFollow) {
var lookup = FS.lookupPath(path, { follow: !dontFollow });
var node = lookup.node;
if (!node) {
throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
}
if (!node.node_ops.getattr) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}
return node.node_ops.getattr(node);
},lstat:function (path) {
return FS.stat(path, true);
},chmod:function (path, mode, dontFollow) {
var node;
if (typeof path === 'string') {
var lookup = FS.lookupPath(path, { follow: !dontFollow });
node = lookup.node;
} else {
node = path;
}
if (!node.node_ops.setattr) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}
node.node_ops.setattr(node, {
mode: (mode & 4095) | (node.mode & ~4095),
timestamp: Date.now()
});
},lchmod:function (path, mode) {
FS.chmod(path, mode, true);
},fchmod:function (fd, mode) {
var stream = FS.getStream(fd);
if (!stream) {
throw new FS.ErrnoError(ERRNO_CODES.EBADF);
}
FS.chmod(stream.node, mode);
},chown:function (path, uid, gid, dontFollow) {
var node;
if (typeof path === 'string') {
var lookup = FS.lookupPath(path, { follow: !dontFollow });
node = lookup.node;
} else {
node = path;
}
if (!node.node_ops.setattr) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}
node.node_ops.setattr(node, {
timestamp: Date.now()
// we ignore the uid / gid for now
});
},lchown:function (path, uid, gid) {
FS.chown(path, uid, gid, true);
},fchown:function (fd, uid, gid) {
var stream = FS.getStream(fd);
if (!stream) {
throw new FS.ErrnoError(ERRNO_CODES.EBADF);
}
FS.chown(stream.node, uid, gid);
},truncate:function (path, len) {
if (len < 0) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
var node;
if (typeof path === 'string') {
var lookup = FS.lookupPath(path, { follow: true });
node = lookup.node;
} else {
node = path;
}
if (!node.node_ops.setattr) {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}
if (FS.isDir(node.mode)) {
throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
}
if (!FS.isFile(node.mode)) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
var err = FS.nodePermissions(node, 'w');
if (err) {
throw new FS.ErrnoError(err);
}
node.node_ops.setattr(node, {
size: len,
timestamp: Date.now()
});
},ftruncate:function (fd, len) {
var stream = FS.getStream(fd);
if (!stream) {
throw new FS.ErrnoError(ERRNO_CODES.EBADF);
}
if ((stream.flags & 2097155) === 0) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
FS.truncate(stream.node, len);
},utime:function (path, atime, mtime) {
var lookup = FS.lookupPath(path, { follow: true });
var node = lookup.node;
node.node_ops.setattr(node, {
timestamp: Math.max(atime, mtime)
});
},open:function (path, flags, mode, fd_start, fd_end) {
if (path === "") {
throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
}
flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;
mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;
if ((flags & 64)) {
mode = (mode & 4095) | 32768;
} else {
mode = 0;
}
var node;
if (typeof path === 'object') {
node = path;
} else {
path = PATH.normalize(path);
try {
var lookup = FS.lookupPath(path, {
follow: !(flags & 131072)
});
node = lookup.node;
} catch (e) {
// ignore
}
}
// perhaps we need to create the node
var created = false;
if ((flags & 64)) {
if (node) {
// if O_CREAT and O_EXCL are set, error out if the node already exists
if ((flags & 128)) {
throw new FS.ErrnoError(ERRNO_CODES.EEXIST);
}
} else {
// node doesn't exist, try to create it
node = FS.mknod(path, mode, 0);
created = true;
}
}
if (!node) {
throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
}
// can't truncate a device
if (FS.isChrdev(node.mode)) {
flags &= ~512;
}
// if asked only for a directory, then this must be one
if ((flags & 65536) && !FS.isDir(node.mode)) {
throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
}
// check permissions, if this is not a file we just created now (it is ok to
// create and write to a file with read-only permissions; it is read-only
// for later use)
if (!created) {
var err = FS.mayOpen(node, flags);
if (err) {
throw new FS.ErrnoError(err);
}
}
// do truncation if necessary
if ((flags & 512)) {
FS.truncate(node, 0);
}
// we've already handled these, don't pass down to the underlying vfs
flags &= ~(128 | 512);
// register the stream with the filesystem
var stream = FS.createStream({
node: node,
path: FS.getPath(node), // we want the absolute path to the node
flags: flags,
seekable: true,
position: 0,
stream_ops: node.stream_ops,
// used by the file family libc calls (fopen, fwrite, ferror, etc.)
ungotten: [],
error: false
}, fd_start, fd_end);
// call the new stream's open function
if (stream.stream_ops.open) {
stream.stream_ops.open(stream);
}
if (Module['logReadFiles'] && !(flags & 1)) {
if (!FS.readFiles) FS.readFiles = {};
if (!(path in FS.readFiles)) {
FS.readFiles[path] = 1;
Module['printErr']('read file: ' + path);
}
}
try {
if (FS.trackingDelegate['onOpenFile']) {
var trackingFlags = 0;
if ((flags & 2097155) !== 1) {
trackingFlags |= FS.tracking.openFlags.READ;
}
if ((flags & 2097155) !== 0) {
trackingFlags |= FS.tracking.openFlags.WRITE;
}
FS.trackingDelegate['onOpenFile'](path, trackingFlags);
}
} catch(e) {
console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: " + e.message);
}
return stream;
},close:function (stream) {
if (stream.getdents) stream.getdents = null; // free readdir state
try {
if (stream.stream_ops.close) {
stream.stream_ops.close(stream);
}
} catch (e) {
throw e;
} finally {
FS.closeStream(stream.fd);
}
},llseek:function (stream, offset, whence) {
if (!stream.seekable || !stream.stream_ops.llseek) {
throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
}
stream.position = stream.stream_ops.llseek(stream, offset, whence);
stream.ungotten = [];
return stream.position;
},read:function (stream, buffer, offset, length, position) {
if (length < 0 || position < 0) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
if ((stream.flags & 2097155) === 1) {
throw new FS.ErrnoError(ERRNO_CODES.EBADF);
}
if (FS.isDir(stream.node.mode)) {
throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
}
if (!stream.stream_ops.read) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
var seeking = true;
if (typeof position === 'undefined') {
position = stream.position;
seeking = false;
} else if (!stream.seekable) {
throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
}
var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);
if (!seeking) stream.position += bytesRead;
return bytesRead;
},write:function (stream, buffer, offset, length, position, canOwn) {
if (length < 0 || position < 0) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
if ((stream.flags & 2097155) === 0) {
throw new FS.ErrnoError(ERRNO_CODES.EBADF);
}
if (FS.isDir(stream.node.mode)) {
throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
}
if (!stream.stream_ops.write) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
if (stream.flags & 1024) {
// seek to the end before writing in append mode
FS.llseek(stream, 0, 2);
}
var seeking = true;
if (typeof position === 'undefined') {
position = stream.position;
seeking = false;
} else if (!stream.seekable) {
throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
}
var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);
if (!seeking) stream.position += bytesWritten;
try {
if (stream.path && FS.trackingDelegate['onWriteToFile']) FS.trackingDelegate['onWriteToFile'](stream.path);
} catch(e) {
console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: " + e.message);
}
return bytesWritten;
},allocate:function (stream, offset, length) {
if (offset < 0 || length <= 0) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
}
if ((stream.flags & 2097155) === 0) {
throw new FS.ErrnoError(ERRNO_CODES.EBADF);
}
if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {
throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
}
if (!stream.stream_ops.allocate) {
throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);
}
stream.stream_ops.allocate(stream, offset, length);
},mmap:function (stream, buffer, offset, length, position, prot, flags) {
// TODO if PROT is PROT_WRITE, make sure we have write access
if ((stream.flags & 2097155) === 1) {
throw new FS.ErrnoError(ERRNO_CODES.EACCES);
}
if (!stream.stream_ops.mmap) {
throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
}
return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);
},msync:function (stream, buffer, offset, length, mmapFlags) {
if (!stream || !stream.stream_ops.msync) {
return 0;
}
return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags);
},munmap:function (stream) {
return 0;
},ioctl:function (stream, cmd, arg) {
if (!stream.stream_ops.ioctl) {
throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);
}
return stream.stream_ops.ioctl(stream, cmd, arg);
},readFile:function (path, opts) {
opts = opts || {};
opts.flags = opts.flags || 'r';
opts.encoding = opts.encoding || 'binary';
if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
throw new Error('Invalid encoding type "' + opts.encoding + '"');
}
var ret;
var stream = FS.open(path, opts.flags);
var stat = FS.stat(path);
var length = stat.size;
var buf = new Uint8Array(length);
FS.read(stream, buf, 0, length, 0);
if (opts.encoding === 'utf8') {
ret = UTF8ArrayToString(buf, 0);
} else if (opts.encoding === 'binary') {
ret = buf;
}
FS.close(stream);
return ret;
},writeFile:function (path, data, opts) {
opts = opts || {};
opts.flags = opts.flags || 'w';
opts.encoding = opts.encoding || 'utf8';
if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
throw new Error('Invalid encoding type "' + opts.encoding + '"');
}
var stream = FS.open(path, opts.flags, opts.mode);
if (opts.encoding === 'utf8') {
var buf = new Uint8Array(lengthBytesUTF8(data)+1);
var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
FS.write(stream, buf, 0, actualNumBytes, 0, opts.canOwn);
} else if (opts.encoding === 'binary') {
FS.write(stream, data, 0, data.length, 0, opts.canOwn);
}
FS.close(stream);
},cwd:function () {
return FS.currentPath;
},chdir:function (path) {
var lookup = FS.lookupPath(path, { follow: true });
if (lookup.node === null) {
throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
}
if (!FS.isDir(lookup.node.mode)) {
throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
}
var err = FS.nodePermissions(lookup.node, 'x');
if (err) {
throw new FS.ErrnoError(err);
}
FS.currentPath = lookup.path;
},createDefaultDirectories:function () {
FS.mkdir('/tmp');
FS.mkdir('/home');
FS.mkdir('/home/web_user');
},createDefaultDevices:function () {
// create /dev
FS.mkdir('/dev');
// setup /dev/null
FS.registerDevice(FS.makedev(1, 3), {
read: function() { return 0; },
write: function(stream, buffer, offset, length, pos) { return length; }
});
FS.mkdev('/dev/null', FS.makedev(1, 3));
// setup /dev/tty and /dev/tty1
// stderr needs to print output using Module['printErr']
// so we register a second tty just for it.
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));
// setup /dev/[u]random
var random_device;
if (typeof crypto !== 'undefined') {
// for modern web browsers
var randomBuffer = new Uint8Array(1);
random_device = function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; };
} else if (ENVIRONMENT_IS_NODE) {
// for nodejs
random_device = function() { return require('crypto').randomBytes(1)[0]; };
} else {
// default for ES5 platforms
random_device = function() { return (Math.random()*256)|0; };
}
FS.createDevice('/dev', 'random', random_device);
FS.createDevice('/dev', 'urandom', random_device);
// we're not going to emulate the actual shm device,
// just create the tmp dirs that reside in it commonly
FS.mkdir('/dev/shm');
FS.mkdir('/dev/shm/tmp');
},createSpecialDirectories:function () {
// create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the name of the stream for fd 6 (see test_unistd_ttyname)
FS.mkdir('/proc');
FS.mkdir('/proc/self');
FS.mkdir('/proc/self/fd');
FS.mount({
mount: function() {
var node = FS.createNode('/proc/self', 'fd', 16384 | 511 /* 0777 */, 73);
node.node_ops = {
lookup: function(parent, name) {
var fd = +name;
var stream = FS.getStream(fd);
if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
var ret = {
parent: null,
mount: { mountpoint: 'fake' },
node_ops: { readlink: function() { return stream.path } }
};
ret.parent = ret; // make it look like a simple root node
return ret;
}
};
return node;
}
}, {}, '/proc/self/fd');
},createStandardStreams:function () {
// TODO deprecate the old functionality of a single
// input / output callback and that utilizes FS.createDevice
// and instead require a unique set of stream ops
// by default, we symlink the standard streams to the
// default tty devices. however, if the standard streams
// have been overwritten we create a unique device for
// them instead.
if (Module['stdin']) {
FS.createDevice('/dev', 'stdin', Module['stdin']);
} else {
FS.symlink('/dev/tty', '/dev/stdin');
}
if (Module['stdout']) {
FS.createDevice('/dev', 'stdout', null, Module['stdout']);
} else {
FS.symlink('/dev/tty', '/dev/stdout');
}
if (Module['stderr']) {
FS.createDevice('/dev', 'stderr', null, Module['stderr']);
} else {
FS.symlink('/dev/tty1', '/dev/stderr');
}
// open default streams for the stdin, stdout and stderr devices
var stdin = FS.open('/dev/stdin', 'r');
assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');
var stdout = FS.open('/dev/stdout', 'w');
assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')');
var stderr = FS.open('/dev/stderr', 'w');
assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')');
},ensureErrnoError:function () {
if (FS.ErrnoError) return;
FS.ErrnoError = function ErrnoError(errno, node) {
//Module.printErr(stackTrace()); // useful for debugging
this.node = node;
this.setErrno = function(errno) {
this.errno = errno;
for (var key in ERRNO_CODES) {
if (ERRNO_CODES[key] === errno) {
this.code = key;
break;
}
}
};
this.setErrno(errno);
this.message = ERRNO_MESSAGES[errno];
};
FS.ErrnoError.prototype = new Error();
FS.ErrnoError.prototype.constructor = FS.ErrnoError;
// Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)
[ERRNO_CODES.ENOENT].forEach(function(code) {
FS.genericErrors[code] = new FS.ErrnoError(code);
FS.genericErrors[code].stack = '<generic error, no stack>';
});
},staticInit:function () {
FS.ensureErrnoError();
FS.nameTable = new Array(4096);
FS.mount(MEMFS, {}, '/');
FS.createDefaultDirectories();
FS.createDefaultDevices();
FS.createSpecialDirectories();
FS.filesystems = {
'MEMFS': MEMFS,
'IDBFS': IDBFS,
'NODEFS': NODEFS,
'WORKERFS': WORKERFS,
};
},init:function (input, output, error) {
assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');
FS.init.initialized = true;
FS.ensureErrnoError();
// Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here
Module['stdin'] = input || Module['stdin'];
Module['stdout'] = output || Module['stdout'];
Module['stderr'] = error || Module['stderr'];
FS.createStandardStreams();
},quit:function () {
FS.init.initialized = false;
// force-flush all streams, so we get musl std streams printed out
var fflush = Module['_fflush'];
if (fflush) fflush(0);
// close all of our streams
for (var i = 0; i < FS.streams.length; i++) {
var stream = FS.streams[i];
if (!stream) {
continue;
}
FS.close(stream);
}
},getMode:function (canRead, canWrite) {
var mode = 0;
if (canRead) mode |= 292 | 73;
if (canWrite) mode |= 146;
return mode;
},joinPath:function (parts, forceRelative) {
var path = PATH.join.apply(null, parts);
if (forceRelative && path[0] == '/') path = path.substr(1);
return path;
},absolutePath:function (relative, base) {
return PATH.resolve(base, relative);
},standardizePath:function (path) {
return PATH.normalize(path);
},findObject:function (path, dontResolveLastLink) {
var ret = FS.analyzePath(path, dontResolveLastLink);
if (ret.exists) {
return ret.object;
} else {
___setErrNo(ret.error);
return null;
}
},analyzePath:function (path, dontResolveLastLink) {
// operate from within the context of the symlink's target
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;
},createFolder:function (parent, name, canRead, canWrite) {
var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
var mode = FS.getMode(canRead, canWrite);
return FS.mkdir(path, mode);
},createPath:function (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) {
// ignore EEXIST
}
parent = current;
}
return current;
},createFile:function (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:function (parent, name, data, canRead, canWrite, canOwn) {
var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(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;
}
// make sure we can write to the file
FS.chmod(node, mode | 146);
var stream = FS.open(node, 'w');
FS.write(stream, data, 0, data.length, 0, canOwn);
FS.close(stream);
FS.chmod(node, mode);
}
return node;
},createDevice:function (parent, name, input, output) {
var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
var mode = FS.getMode(!!input, !!output);
if (!FS.createDevice.major) FS.createDevice.major = 64;
var dev = FS.makedev(FS.createDevice.major++, 0);
// Create a fake device that a set of stream ops to emulate
// the old behavior.
FS.registerDevice(dev, {
open: function(stream) {
stream.seekable = false;
},
close: function(stream) {
// flush any pending line data
if (output && output.buffer && output.buffer.length) {
output(10);
}
},
read: function(stream, buffer, offset, length, pos /* ignored */) {
var bytesRead = 0;
for (var i = 0; i < length; i++) {
var result;
try {
result = input();
} catch (e) {
throw new FS.ErrnoError(ERRNO_CODES.EIO);
}
if (result === undefined && bytesRead === 0) {
throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
}
if (result === null || result === undefined) break;
bytesRead++;
buffer[offset+i] = result;
}
if (bytesRead) {
stream.node.timestamp = Date.now();
}
return bytesRead;
},
write: function(stream, buffer, offset, length, pos) {
for (var i = 0; i < length; i++) {
try {
output(buffer[offset+i]);
} catch (e) {
throw new FS.ErrnoError(ERRNO_CODES.EIO);
}
}
if (length) {
stream.node.timestamp = Date.now();
}
return i;
}
});
return FS.mkdev(path, mode, dev);
},createLink:function (parent, name, target, canRead, canWrite) {
var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
return FS.symlink(target, path);
},forceLoadFile:function (obj) {
if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
var success = true;
if (typeof XMLHttpRequest !== 'undefined') {
throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");
} else if (Module['read']) {
// Command-line.
try {
// WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as
// read() will try to parse UTF8.
obj.contents = intArrayFromString(Module['read'](obj.url), true);
obj.usedBytes = obj.contents.length;
} catch (e) {
success = false;
}
} else {
throw new Error('Cannot load without read() or XMLHttpRequest.');
}
if (!success) ___setErrNo(ERRNO_CODES.EIO);
return success;
},createLazyFile:function (parent, name, url, canRead, canWrite) {
// Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.
function LazyUint8Array() {
this.lengthKnown = false;
this.chunks = []; // Loaded chunks. Index is the chunk number
}
LazyUint8Array.prototype.get = function LazyUint8Array_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];
}
LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
this.getter = getter;
}
LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
// Find length
var xhr = new XMLHttpRequest();
xhr.open('HEAD', url, false);
xhr.send(null);
if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
var datalength = Number(xhr.getResponseHeader("Content-length"));
var header;
var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip";
var chunkSize = 1024*1024; // Chunk size in bytes
if (!hasByteServing) chunkSize = datalength;
// Function to get a range from the remote URL.
var doXHR = (function(from, to) {
if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!");
// TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
// Some hints to the browser that we want binary data.
if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';
if (xhr.overrideMimeType) {
xhr.overrideMimeType('text/plain; charset=x-user-defined');
}
xhr.send(null);
if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
if (xhr.response !== undefined) {
return new Uint8Array(xhr.response || []);
} else {
return intArrayFromString(xhr.responseText || '', true);
}
});
var lazyArray = this;
lazyArray.setDataGetter(function(chunkNum) {
var start = chunkNum * chunkSize;
var end = (chunkNum+1) * chunkSize - 1; // including this byte
end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block
if (typeof(lazyArray.chunks[chunkNum]) === "undefined") {
lazyArray.chunks[chunkNum] = doXHR(start, end);
}
if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!");
return lazyArray.chunks[chunkNum];
});
if (usesGzip || !datalength) {
// if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length
chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file
datalength = this.getter(0).length;
chunkSize = datalength;
console.log("LazyFiles on gzip forces download of the whole file when length is accessed");
}
this._length = datalength;
this._chunkSize = chunkSize;
this.lengthKnown = true;
}
if (typeof XMLHttpRequest !== 'undefined') {
if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';
var lazyArray = new LazyUint8Array();
Object.defineProperties(lazyArray, {
length: {
get: function() {
if(!this.lengthKnown) {
this.cacheLength();
}
return this._length;
}
},
chunkSize: {
get: function() {
if(!this.lengthKnown) {
this.cacheLength();
}
return this._chunkSize;
}
}
});
var properties = { isDevice: false, contents: lazyArray };
} else {
var properties = { isDevice: false, url: url };
}
var node = FS.createFile(parent, name, properties, canRead, canWrite);
// This is a total hack, but I want to get this lazy file code out of the
// core of MEMFS. If we want to keep this lazy file concept I feel it should
// be its own thin LAZYFS proxying calls to MEMFS.
if (properties.contents) {
node.contents = properties.contents;
} else if (properties.url) {
node.contents = null;
node.url = properties.url;
}
// Add a function that defers querying the file size until it is asked the first time.
Object.defineProperties(node, {
usedBytes: {
get: function() { return this.contents.length; }
}
});
// override each stream op with one that tries to force load the lazy file first
var stream_ops = {};
var keys = Object.keys(node.stream_ops);
keys.forEach(function(key) {
var fn = node.stream_ops[key];
stream_ops[key] = function forceLoadLazyFile() {
if (!FS.forceLoadFile(node)) {
throw new FS.ErrnoError(ERRNO_CODES.EIO);
}
return fn.apply(null, arguments);
};
});
// use a custom read function
stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
if (!FS.forceLoadFile(node)) {
throw new FS.ErrnoError(ERRNO_CODES.EIO);
}
var contents = stream.node.contents;
if (position >= contents.length)
return 0;
var size = Math.min(contents.length - position, length);
assert(size >= 0);
if (contents.slice) { // normal array
for (var i = 0; i < size; i++) {
buffer[offset + i] = contents[position + i];
}
} else {
for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR
buffer[offset + i] = contents.get(position + i);
}
}
return size;
};
node.stream_ops = stream_ops;
return node;
},createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) {
Browser.init(); // XXX perhaps this method should move onto Browser?
// TODO we should allow people to just pass in a complete filename instead
// of parent and name being that we just join them anyways
var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname
function processData(byteArray) {
function finish(byteArray) {
if (preFinish) preFinish();
if (!dontCreateFile) {
FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);
}
if (onload) onload();
removeRunDependency(dep);
}
var handled = false;
Module['preloadPlugins'].forEach(function(plugin) {
if (handled) return;
if (plugin['canHandle'](fullname)) {
plugin['handle'](byteArray, fullname, finish, function() {
if (onerror) onerror();
removeRunDependency(dep);
});
handled = true;
}
});
if (!handled) finish(byteArray);
}
addRunDependency(dep);
if (typeof url == 'string') {
Browser.asyncLoad(url, function(byteArray) {
processData(byteArray);
}, onerror);
} else {
processData(url);
}
},indexedDB:function () {
return Module.indexedDB;
},DB_NAME:function () {
return 'EM_FS_' + window.location.pathname;
},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, onload, onerror) {
onload = onload || function(){};
onerror = onerror || function(){};
var indexedDB = FS.indexedDB();
try {
var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
} catch (e) {
return onerror(e);
}
openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
console.log('creating db');
var db = openRequest.result;
db.createObjectStore(FS.DB_STORE_NAME);
};
openRequest.onsuccess = function openRequest_onsuccess() {
var db = openRequest.result;
var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');
var files = transaction.objectStore(FS.DB_STORE_NAME);
var ok = 0, fail = 0, total = paths.length;
function finish() {
if (fail == 0) onload(); else onerror();
}
paths.forEach(function(path) {
var putRequest = files.put(FS.analyzePath(path).object.contents, path);
putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };
putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };
});
transaction.onerror = onerror;
};
openRequest.onerror = onerror;
},loadFilesFromDB:function (paths, onload, onerror) {
onload = onload || function(){};
onerror = onerror || function(){};
var indexedDB = FS.indexedDB();
try {
var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
} catch (e) {
return onerror(e);
}
openRequest.onupgradeneeded = onerror; // no database to load from
openRequest.onsuccess = function openRequest_onsuccess() {
var db = openRequest.result;
try {
var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');
} catch(e) {
onerror(e);
return;
}
var files = transaction.objectStore(FS.DB_STORE_NAME);
var ok = 0, fail = 0, total = paths.length;
function finish() {
if (fail == 0) onload(); else onerror();
}
paths.forEach(function(path) {
var getRequest = files.get(path);
getRequest.onsuccess = function getRequest_onsuccess() {
if (FS.analyzePath(path).exists) {
FS.unlink(path);
}
FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
ok++;
if (ok + fail == total) finish();
};
getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };
});
transaction.onerror = onerror;
};
openRequest.onerror = onerror;
}};function _utime(path, times) {
// int utime(const char *path, const struct utimbuf *times);
// http://pubs.opengroup.org/onlinepubs/009695399/basedefs/utime.h.html
var time;
if (times) {
// NOTE: We don't keep track of access timestamps.
var offset = 4;
time = HEAP32[(((times)+(offset))>>2)];
time *= 1000;
} else {
time = Date.now();
}
path = Pointer_stringify(path);
try {
FS.utime(path, time, time);
return 0;
} catch (e) {
FS.handleFSError(e);
return -1;
}
}
function _emscripten_glCopyTexImage2D(x0, x1, x2, x3, x4, x5, x6, x7) { GLctx['copyTexImage2D'](x0, x1, x2, x3, x4, x5, x6, x7) }
function _emscripten_set_devicemotion_callback(userData, useCapture, callbackfunc) {
JSEvents.registerDeviceMotionEventCallback(window, userData, useCapture, callbackfunc, 17, "devicemotion");
return 0;
}
function _JS_SystemInfo_HasFullscreen()
{
return UnityLoader.SystemInfo.hasFullscreen;
}
function _emscripten_glTexParameterfv(target, pname, params) {
var param = HEAPF32[((params)>>2)];
GLctx.texParameterf(target, pname, param);
}
function _emscripten_glDepthRangef(x0, x1) { GLctx['depthRange'](x0, x1) }
var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:function (dirfd, path) {
if (path[0] !== '/') {
// relative path
var dir;
if (dirfd === -100) {
dir = FS.cwd();
} else {
var dirstream = FS.getStream(dirfd);
if (!dirstream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
dir = dirstream.path;
}
path = PATH.join2(dir, path);
}
return path;
},doStat:function (func, path, buf) {
try {
var stat = func(path);
} catch (e) {
if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) {
// an error occurred while trying to look up the path; we should just report ENOTDIR
return -ERRNO_CODES.ENOTDIR;
}
throw e;
}
HEAP32[((buf)>>2)]=stat.dev;
HEAP32[(((buf)+(4))>>2)]=0;
HEAP32[(((buf)+(8))>>2)]=stat.ino;
HEAP32[(((buf)+(12))>>2)]=stat.mode;
HEAP32[(((buf)+(16))>>2)]=stat.nlink;
HEAP32[(((buf)+(20))>>2)]=stat.uid;
HEAP32[(((buf)+(24))>>2)]=stat.gid;
HEAP32[(((buf)+(28))>>2)]=stat.rdev;
HEAP32[(((buf)+(32))>>2)]=0;
HEAP32[(((buf)+(36))>>2)]=stat.size;
HEAP32[(((buf)+(40))>>2)]=4096;
HEAP32[(((buf)+(44))>>2)]=stat.blocks;
HEAP32[(((buf)+(48))>>2)]=(stat.atime.getTime() / 1000)|0;
HEAP32[(((buf)+(52))>>2)]=0;
HEAP32[(((buf)+(56))>>2)]=(stat.mtime.getTime() / 1000)|0;
HEAP32[(((buf)+(60))>>2)]=0;
HEAP32[(((buf)+(64))>>2)]=(stat.ctime.getTime() / 1000)|0;
HEAP32[(((buf)+(68))>>2)]=0;
HEAP32[(((buf)+(72))>>2)]=stat.ino;
return 0;
},doMsync:function (addr, stream, len, flags) {
var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len));
FS.msync(stream, buffer, 0, len, flags);
},doMkdir:function (path, mode) {
// remove a trailing slash, if one - /a/b/ has basename of '', but
// we want to create b in the context of this function
path = PATH.normalize(path);
if (path[path.length-1] === '/') path = path.substr(0, path.length-1);
FS.mkdir(path, mode, 0);
return 0;
},doMknod:function (path, mode, dev) {
// we don't want this in the JS API as it uses mknod to create all nodes.
switch (mode & 61440) {
case 32768:
case 8192:
case 24576:
case 4096:
case 49152:
break;
default: return -ERRNO_CODES.EINVAL;
}
FS.mknod(path, mode, dev);
return 0;
},doReadlink:function (path, buf, bufsize) {
if (bufsize <= 0) return -ERRNO_CODES.EINVAL;
var ret = FS.readlink(path);
var len = Math.min(bufsize, lengthBytesUTF8(ret));
var endChar = HEAP8[buf+len];
stringToUTF8(ret, buf, bufsize+1);
// readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!)
// stringToUTF8() always appends a null byte, so restore the character under the null byte after the write.
HEAP8[buf+len] = endChar;
return len;
},doAccess:function (path, amode) {
if (amode & ~7) {
// need a valid mode
return -ERRNO_CODES.EINVAL;
}
var node;
var lookup = FS.lookupPath(path, { follow: true });
node = lookup.node;
var perms = '';
if (amode & 4) perms += 'r';
if (amode & 2) perms += 'w';
if (amode & 1) perms += 'x';
if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) {
return -ERRNO_CODES.EACCES;
}
return 0;
},doDup:function (path, flags, suggestFD) {
var suggest = FS.getStream(suggestFD);
if (suggest) FS.close(suggest);
return FS.open(path, flags, 0, suggestFD, suggestFD).fd;
},doReadv:function (stream, iov, iovcnt, offset) {
var ret = 0;
for (var i = 0; i < iovcnt; i++) {
var ptr = HEAP32[(((iov)+(i*8))>>2)];
var len = HEAP32[(((iov)+(i*8 + 4))>>2)];
var curr = FS.read(stream, HEAP8,ptr, len, offset);
if (curr < 0) return -1;
ret += curr;
if (curr < len) break; // nothing more to read
}
return ret;
},doWritev:function (stream, iov, iovcnt, offset) {
var ret = 0;
for (var i = 0; i < iovcnt; i++) {
var ptr = HEAP32[(((iov)+(i*8))>>2)];
var len = HEAP32[(((iov)+(i*8 + 4))>>2)];
var curr = FS.write(stream, HEAP8,ptr, len, offset);
if (curr < 0) return -1;
ret += curr;
}
return ret;
},varargs:0,get:function (varargs) {
SYSCALLS.varargs += 4;
var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)];
return ret;
},getStr:function () {
var ret = Pointer_stringify(SYSCALLS.get());
return ret;
},getStreamFromFD:function () {
var stream = FS.getStream(SYSCALLS.get());
if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
return stream;
},getSocketFromFD:function () {
var socket = SOCKFS.getSocket(SYSCALLS.get());
if (!socket) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
return socket;
},getSocketAddress:function (allowNull) {
var addrp = SYSCALLS.get(), addrlen = SYSCALLS.get();
if (allowNull && addrp === 0) return null;
var info = __read_sockaddr(addrp, addrlen);
if (info.errno) throw new FS.ErrnoError(info.errno);
info.addr = DNS.lookup_addr(info.addr) || info.addr;
return info;
},get64:function () {
var low = SYSCALLS.get(), high = SYSCALLS.get();
if (low >= 0) assert(high === 0);
else assert(high === -1);
return low;
},getZero:function () {
assert(SYSCALLS.get() === 0);
}};function ___syscall168(which, varargs) {SYSCALLS.varargs = varargs;
try {
// poll
var fds = SYSCALLS.get(), nfds = SYSCALLS.get(), timeout = SYSCALLS.get();
var nonzero = 0;
for (var i = 0; i < nfds; i++) {
var pollfd = fds + 8 * i;
var fd = HEAP32[((pollfd)>>2)];
var events = HEAP16[(((pollfd)+(4))>>1)];
var mask = 32;
var stream = FS.getStream(fd);
if (stream) {
mask = SYSCALLS.DEFAULT_POLLMASK;
if (stream.stream_ops.poll) {
mask = stream.stream_ops.poll(stream);
}
}
mask &= events | 8 | 16;
if (mask) nonzero++;
HEAP16[(((pollfd)+(6))>>1)]=mask;
}
return nonzero;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _JS_SystemInfo_GetBrowserName(buffer, bufferSize)
{
var browser = UnityLoader.SystemInfo.browser;
if (buffer)
stringToUTF8(browser, buffer, bufferSize);
return lengthBytesUTF8(browser);
}
function _emscripten_glGetObjectParameterivARB() {
Module['printErr']('missing function: emscripten_glGetObjectParameterivARB'); abort(-1);
}
function _glCreateShader(shaderType) {
var id = GL.getNewId(GL.shaders);
GL.shaders[id] = GLctx.createShader(shaderType);
return id;
}
function _emscripten_glBindAttribLocation(program, index, name) {
name = Pointer_stringify(name);
GLctx.bindAttribLocation(GL.programs[program], index, name);
}
function _glInvalidateFramebuffer(target, numAttachments, attachments) {
var list = [];
for (var i = 0; i < numAttachments; i++)
list.push(HEAP32[(((attachments)+(i*4))>>2)]);
GLctx['invalidateFramebuffer'](target, list);
}
function _glCompressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, data) {
var heapView;
if (data) {
heapView = HEAPU8.subarray((data),(data+imageSize));
} else {
heapView = null;
}
GLctx['compressedTexImage2D'](target, level, internalFormat, width, height, border, heapView);
}
function _glBlendFuncSeparate(x0, x1, x2, x3) { GLctx['blendFuncSeparate'](x0, x1, x2, x3) }
Module["_memset"] = _memset;
function _glDrawBuffers(n, bufs) {
var bufArray = [];
for (var i = 0; i < n; i++)
bufArray.push(HEAP32[(((bufs)+(i*4))>>2)]);
GLctx['drawBuffers'](bufArray);
}
function _JS_SystemInfo_HasCursorLock()
{
return UnityLoader.SystemInfo.hasCursorLock;
}
var wr={requestInstances:{},nextRequestId:1};function _JS_WebRequest_Send(request, ptr, length)
{
var http = wr.requestInstances[request];
try {
if (length > 0)
http.send(HEAPU8.subarray(ptr, ptr+length));
else
http.send();
}
catch(e) {
console.error(e.name + ": " + e.message);
}
}
function ___lock() {}
function _emscripten_glGetVertexAttribPointerv(index, pname, pointer) {
if (!pointer) {
// GLES2 specification does not specify how to behave if pointer is a null pointer. Since calling this function does not make sense
// if pointer == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
HEAP32[((pointer)>>2)]=GLctx.getVertexAttribOffset(index, pname);
}
function _emscripten_glVertexAttrib3f(x0, x1, x2, x3) { GLctx['vertexAttrib3f'](x0, x1, x2, x3) }
function _clock() {
if (_clock.start === undefined) _clock.start = Date.now();
return ((Date.now() - _clock.start) * (1000000 / 1000))|0;
}
var _llvm_ctlz_i32=true;
function _glGetInternalformativ() {
Module['printErr']('missing function: glGetInternalformativ'); abort(-1);
}
function _glDeleteProgram(id) {
if (!id) return;
var program = GL.programs[id];
if (!program) { // glDeleteProgram actually signals an error when deleting a nonexisting object, unlike some other GL delete functions.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
GLctx.deleteProgram(program);
program.name = 0;
GL.programs[id] = null;
GL.programInfos[id] = null;
}
function _glRenderbufferStorage(x0, x1, x2, x3) { GLctx['renderbufferStorage'](x0, x1, x2, x3) }
var WEBAudio={audioInstances:[],audioContext:{},audioWebEnabled:0};function _JS_Sound_SetListenerPosition(x, y, z)
{
if (WEBAudio.audioWebEnabled == 0)
return;
WEBAudio.audioContext.listener.setPosition(x, y, z);
}
function _pthread_detach() {}
function _emscripten_set_touchstart_callback(target, userData, useCapture, callbackfunc) {
JSEvents.registerTouchEventCallback(target, userData, useCapture, callbackfunc, 22, "touchstart");
return 0;
}
function _emscripten_glDeleteShader(id) {
if (!id) return;
var shader = GL.shaders[id];
if (!shader) { // glDeleteShader actually signals an error when deleting a nonexisting object, unlike some other GL delete functions.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
GLctx.deleteShader(shader);
GL.shaders[id] = null;
}
function _pthread_attr_init(attr) {
/* int pthread_attr_init(pthread_attr_t *attr); */
//FIXME: should allocate a pthread_attr_t
return 0;
}
function _emscripten_glDrawArraysInstanced(mode, first, count, primcount) {
GLctx['drawArraysInstanced'](mode, first, count, primcount);
}
function _emscripten_glDeleteBuffers(n, buffers) {
for (var i = 0; i < n; i++) {
var id = HEAP32[(((buffers)+(i*4))>>2)];
var buffer = GL.buffers[id];
// From spec: "glDeleteBuffers silently ignores 0's and names that do not
// correspond to existing buffer objects."
if (!buffer) continue;
GLctx.deleteBuffer(buffer);
buffer.name = 0;
GL.buffers[id] = null;
if (id == GL.currArrayBuffer) GL.currArrayBuffer = 0;
if (id == GL.currElementArrayBuffer) GL.currElementArrayBuffer = 0;
}
}
function _emscripten_glTexParameteriv(target, pname, params) {
var param = HEAP32[((params)>>2)];
GLctx.texParameteri(target, pname, param);
}
function _emscripten_glUniformMatrix2fv(location, count, transpose, value) {
location = GL.uniforms[location];
var view;
if (4*count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[4*count-1];
for (var i = 0; i < 4*count; i += 4) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)];
view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)];
view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*16)>>2);
}
GLctx.uniformMatrix2fv(location, !!transpose, view);
}
function ___syscall5(which, varargs) {SYSCALLS.varargs = varargs;
try {
// open
var pathname = SYSCALLS.getStr(), flags = SYSCALLS.get(), mode = SYSCALLS.get() // optional TODO
var stream = FS.open(pathname, flags, mode);
return stream.fd;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall4(which, varargs) {SYSCALLS.varargs = varargs;
try {
// write
var stream = SYSCALLS.getStreamFromFD(), buf = SYSCALLS.get(), count = SYSCALLS.get();
return FS.write(stream, HEAP8,buf, count);
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall6(which, varargs) {SYSCALLS.varargs = varargs;
try {
// close
var stream = SYSCALLS.getStreamFromFD();
FS.close(stream);
return 0;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _glGenVertexArrays(n, arrays) {
for (var i = 0; i < n; i++) {
var vao = GLctx['createVertexArray']();
if (!vao) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
while(i < n) HEAP32[(((arrays)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.vaos);
vao.name = id;
GL.vaos[id] = vao;
HEAP32[(((arrays)+(i*4))>>2)]=id;
}
}
function _glTexStorage3D(x0, x1, x2, x3, x4, x5) { GLctx['texStorage3D'](x0, x1, x2, x3, x4, x5) }
function _emscripten_glEnableClientState() {
Module['printErr']('missing function: emscripten_glEnableClientState'); abort(-1);
}
function _emscripten_glStencilMask(x0) { GLctx['stencilMask'](x0) }
function _JS_Sound_SetListenerOrientation(x, y, z, xUp, yUp, zUp)
{
if (WEBAudio.audioWebEnabled == 0)
return;
// Web Audio uses a RHS coordinate system, Unity uses LHS, causing orientations to be flipped.
// So we pass a negative direction here to compensate, otherwise channels will be flipped.
WEBAudio.audioContext.listener.setOrientation(-x, -y, -z, xUp, yUp, zUp);
}
function _JS_Eval_SetTimeout(func, arg, millis)
{
Module['noExitRuntime'] = true;
function wrapper() {
Runtime.getFuncWrapper(func, 'vi')(arg);
}
return Browser.safeSetTimeout(wrapper, millis);
}
function __ZSt18uncaught_exceptionv() { // std::uncaught_exception()
return !!__ZSt18uncaught_exceptionv.uncaught_exception;
}
var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:function (adjusted) {
if (!adjusted || EXCEPTIONS.infos[adjusted]) return adjusted;
for (var ptr in EXCEPTIONS.infos) {
var info = EXCEPTIONS.infos[ptr];
if (info.adjusted === adjusted) {
return ptr;
}
}
return adjusted;
},addRef:function (ptr) {
if (!ptr) return;
var info = EXCEPTIONS.infos[ptr];
info.refcount++;
},decRef:function (ptr) {
if (!ptr) return;
var info = EXCEPTIONS.infos[ptr];
assert(info.refcount > 0);
info.refcount--;
// A rethrown exception can reach refcount 0; it must not be discarded
// Its next handler will clear the rethrown flag and addRef it, prior to
// final decRef and destruction here
if (info.refcount === 0 && !info.rethrown) {
if (info.destructor) {
Module['dynCall_vi'](info.destructor, ptr);
}
delete EXCEPTIONS.infos[ptr];
___cxa_free_exception(ptr);
}
},clearRef:function (ptr) {
if (!ptr) return;
var info = EXCEPTIONS.infos[ptr];
info.refcount = 0;
}};function ___cxa_begin_catch(ptr) {
var info = EXCEPTIONS.infos[ptr];
if (info && !info.caught) {
info.caught = true;
__ZSt18uncaught_exceptionv.uncaught_exception--;
}
if (info) info.rethrown = false;
EXCEPTIONS.caught.push(ptr);
EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));
return ptr;
}
function _glDeleteFramebuffers(n, framebuffers) {
for (var i = 0; i < n; ++i) {
var id = HEAP32[(((framebuffers)+(i*4))>>2)];
var framebuffer = GL.framebuffers[id];
if (!framebuffer) continue; // GL spec: "glDeleteFramebuffers silently ignores 0s and names that do not correspond to existing framebuffer objects".
GLctx.deleteFramebuffer(framebuffer);
framebuffer.name = 0;
GL.framebuffers[id] = null;
}
}
function _glDrawArrays(mode, first, count) {
GLctx.drawArrays(mode, first, count);
}
function _emscripten_webgl_enable_extension(contextHandle, extension) {
var context = GL.getContext(contextHandle);
var extString = Pointer_stringify(extension);
if (extString.indexOf('GL_') == 0) extString = extString.substr(3); // Allow enabling extensions both with "GL_" prefix and without.
var ext = context.GLctx.getExtension(extString);
return ext ? 1 : 0;
}
function _emscripten_get_num_gamepads() {
__emscripten_sample_gamepad_data();
if (!JSEvents.lastGamepadState) return -1;
return JSEvents.lastGamepadState.length;
}
function _emscripten_set_blur_callback(target, userData, useCapture, callbackfunc) {
JSEvents.registerFocusEventCallback(target, userData, useCapture, callbackfunc, 12, "blur");
return 0;
}
function _mktime(tmPtr) {
_tzset();
var date = new Date(HEAP32[(((tmPtr)+(20))>>2)] + 1900,
HEAP32[(((tmPtr)+(16))>>2)],
HEAP32[(((tmPtr)+(12))>>2)],
HEAP32[(((tmPtr)+(8))>>2)],
HEAP32[(((tmPtr)+(4))>>2)],
HEAP32[((tmPtr)>>2)],
0);
// There's an ambiguous hour when the time goes back; the tm_isdst field is
// used to disambiguate it. Date() basically guesses, so we fix it up if it
// guessed wrong, or fill in tm_isdst with the guess if it's -1.
var dst = HEAP32[(((tmPtr)+(32))>>2)];
var guessedOffset = date.getTimezoneOffset();
var start = new Date(date.getFullYear(), 0, 1);
var summerOffset = new Date(2000, 6, 1).getTimezoneOffset();
var winterOffset = start.getTimezoneOffset();
var dstOffset = Math.min(winterOffset, summerOffset); // DST is in December in South
if (dst < 0) {
HEAP32[(((tmPtr)+(32))>>2)]=Number(dstOffset == guessedOffset);
} else if ((dst > 0) != (dstOffset == guessedOffset)) {
var nonDstOffset = Math.max(winterOffset, summerOffset);
var trueOffset = dst > 0 ? dstOffset : nonDstOffset;
// Don't try setMinutes(date.getMinutes() + ...) -- it's messed up.
date.setTime(date.getTime() + (trueOffset - guessedOffset)*60000);
}
HEAP32[(((tmPtr)+(24))>>2)]=date.getDay();
var yday = ((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24))|0;
HEAP32[(((tmPtr)+(28))>>2)]=yday;
return (date.getTime() / 1000)|0;
}
function _glClear(x0) { GLctx['clear'](x0) }
function _glUniform2iv(location, count, value) {
location = GL.uniforms[location];
count *= 2;
value = HEAP32.subarray((value)>>2,(value+count*4)>>2);
GLctx.uniform2iv(location, value);
}
function _glIsEnabled(x0) { return GLctx['isEnabled'](x0) }
function _glFramebufferTexture2D(target, attachment, textarget, texture, level) {
GLctx.framebufferTexture2D(target, attachment, textarget,
GL.textures[texture], level);
}
function _glGetFramebufferAttachmentParameteriv(target, attachment, pname, params) {
var result = GLctx.getFramebufferAttachmentParameter(target, attachment, pname);
HEAP32[((params)>>2)]=result;
}
function _emscripten_request_pointerlock(target, deferUntilInEventHandler) {
if (!target) target = '#canvas';
target = JSEvents.findEventTarget(target);
if (!target) return -4;
if (!target.requestPointerLock && !target.mozRequestPointerLock && !target.webkitRequestPointerLock && !target.msRequestPointerLock) {
return -1;
}
var canPerformRequests = JSEvents.canPerformEventHandlerRequests();
// Queue this function call if we're not currently in an event handler and the user saw it appropriate to do so.
if (!canPerformRequests) {
if (deferUntilInEventHandler) {
JSEvents.deferCall(JSEvents.requestPointerLock, 2 /* priority below fullscreen */, [target]);
return 1;
} else {
return -2;
}
}
return JSEvents.requestPointerLock(target);
}
function _glBindBufferBase(target, index, buffer) {
var bufferObj = buffer ? GL.buffers[buffer] : null;
GLctx['bindBufferBase'](target, index, bufferObj);
}
Module["_pthread_cond_broadcast"] = _pthread_cond_broadcast;
function _gettimeofday(ptr) {
var now = Date.now();
HEAP32[((ptr)>>2)]=(now/1000)|0; // seconds
HEAP32[(((ptr)+(4))>>2)]=((now % 1000)*1000)|0; // microseconds
return 0;
}
function _glTexParameteriv(target, pname, params) {
var param = HEAP32[((params)>>2)];
GLctx.texParameteri(target, pname, param);
}
function _JS_Sound_SetVolume(channelInstance, v)
{
if (WEBAudio.audioWebEnabled == 0)
return;
WEBAudio.audioInstances[channelInstance].gain.gain.value = v;
}
function _glGenFramebuffers(n, ids) {
for (var i = 0; i < n; ++i) {
var framebuffer = GLctx.createFramebuffer();
if (!framebuffer) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
while(i < n) HEAP32[(((ids)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.framebuffers);
framebuffer.name = id;
GL.framebuffers[id] = framebuffer;
HEAP32[(((ids)+(i*4))>>2)]=id;
}
}
function _emscripten_glGetTexParameteriv(target, pname, params) {
if (!params) {
// GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense
// if p == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
HEAP32[((params)>>2)]=GLctx.getTexParameter(target, pname);
}
function ___syscall122(which, varargs) {SYSCALLS.varargs = varargs;
try {
// uname
var buf = SYSCALLS.get();
if (!buf) return -ERRNO_CODES.EFAULT
var layout = {"sysname":0,"nodename":65,"domainname":325,"machine":260,"version":195,"release":130,"__size__":390};
function copyString(element, value) {
var offset = layout[element];
writeAsciiToMemory(value, buf + offset);
}
copyString('sysname', 'Emscripten');
copyString('nodename', 'emscripten');
copyString('release', '1.0');
copyString('version', '#1');
copyString('machine', 'x86-JS');
return 0;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _glDeleteVertexArrays(n, vaos) {
for (var i = 0; i < n; i++) {
var id = HEAP32[(((vaos)+(i*4))>>2)];
GLctx['deleteVertexArray'](GL.vaos[id]);
GL.vaos[id] = null;
}
}
function _emscripten_glSampleCoverage(value, invert) {
GLctx.sampleCoverage(value, !!invert);
}
function _glIsVertexArray(array) {
var vao = GL.vaos[array];
if (!vao) return 0;
return GLctx['isVertexArray'](vao);
}
function _glDisableVertexAttribArray(index) {
GLctx.disableVertexAttribArray(index);
}
function _sysconf(name) {
// long sysconf(int name);
// http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html
switch(name) {
case 30: return PAGE_SIZE;
case 85: return totalMemory / PAGE_SIZE;
case 132:
case 133:
case 12:
case 137:
case 138:
case 15:
case 235:
case 16:
case 17:
case 18:
case 19:
case 20:
case 149:
case 13:
case 10:
case 236:
case 153:
case 9:
case 21:
case 22:
case 159:
case 154:
case 14:
case 77:
case 78:
case 139:
case 80:
case 81:
case 82:
case 68:
case 67:
case 164:
case 11:
case 29:
case 47:
case 48:
case 95:
case 52:
case 51:
case 46:
return 200809;
case 79:
return 0;
case 27:
case 246:
case 127:
case 128:
case 23:
case 24:
case 160:
case 161:
case 181:
case 182:
case 242:
case 183:
case 184:
case 243:
case 244:
case 245:
case 165:
case 178:
case 179:
case 49:
case 50:
case 168:
case 169:
case 175:
case 170:
case 171:
case 172:
case 97:
case 76:
case 32:
case 173:
case 35:
return -1;
case 176:
case 177:
case 7:
case 155:
case 8:
case 157:
case 125:
case 126:
case 92:
case 93:
case 129:
case 130:
case 131:
case 94:
case 91:
return 1;
case 74:
case 60:
case 69:
case 70:
case 4:
return 1024;
case 31:
case 42:
case 72:
return 32;
case 87:
case 26:
case 33:
return 2147483647;
case 34:
case 1:
return 47839;
case 38:
case 36:
return 99;
case 43:
case 37:
return 2048;
case 0: return 2097152;
case 3: return 65536;
case 28: return 32768;
case 44: return 32767;
case 75: return 16384;
case 39: return 1000;
case 89: return 700;
case 71: return 256;
case 40: return 255;
case 2: return 100;
case 180: return 64;
case 25: return 20;
case 5: return 16;
case 6: return 6;
case 73: return 4;
case 84: {
if (typeof navigator === 'object') return navigator['hardwareConcurrency'] || 1;
return 1;
}
}
___setErrNo(ERRNO_CODES.EINVAL);
return -1;
}
function _emscripten_glMatrixMode(){ throw 'Legacy GL function (glMatrixMode) called. If you want legacy GL emulation, you need to compile with -s LEGACY_GL_EMULATION=1 to enable legacy GL emulation.'; }
function _abort() {
Module['abort']();
}
function _JS_Log_Dump(ptr, type)
{
var str = Pointer_stringify(ptr);
if (typeof dump == 'function')
dump (str);
switch (type)
{
case 0: //LogType_Error
case 1: //LogType_Assert
case 4: //LogType_Exception
console.error (str);
return;
case 2: //LogType_Warning
console.warn (str);
return;
case 3: //LogType_Log
case 5: //LogType_Debug
console.log (str);
return;
default:
console.error ("Unknown console message type!")
console.error (str);
}
}
function _emscripten_glPolygonOffset(x0, x1) { GLctx['polygonOffset'](x0, x1) }
function _glDisable(x0) { GLctx['disable'](x0) }
function _emscripten_glIsBuffer(buffer) {
var b = GL.buffers[buffer];
if (!b) return 0;
return GLctx.isBuffer(b);
}
var PTHREAD_SPECIFIC={};function _pthread_getspecific(key) {
return PTHREAD_SPECIFIC[key] || 0;
}
function _glEnable(x0) { GLctx['enable'](x0) }
function _glGetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params) {
if (!params) {
// GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense
// if params == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
if (uniformCount > 0 && uniformIndices == 0) {
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
program = GL.programs[program];
var ids = [];
for (var i = 0; i < uniformCount; i++) {
ids.push(HEAP32[(((uniformIndices)+(i*4))>>2)]);
}
var result = GLctx['getActiveUniforms'](program, ids, pname);
if (!result) return; // GL spec: If an error is generated, nothing is written out to params.
var len = result.length;
for (var i = 0; i < len; i++) {
HEAP32[(((params)+(i*4))>>2)]=result[i];
}
}
function emscriptenWebGLComputeImageSize(width, height, sizePerPixel, alignment) {
function roundedToNextMultipleOf(x, y) {
return Math.floor((x + y - 1) / y) * y
}
var plainRowSize = width * sizePerPixel;
var alignedRowSize = roundedToNextMultipleOf(plainRowSize, alignment);
return (height <= 0) ? 0 :
((height - 1) * alignedRowSize + plainRowSize);
}function emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, internalFormat) {
var sizePerPixel;
var numChannels;
switch(format) {
case 0x1906 /* GL_ALPHA */:
case 0x1909 /* GL_LUMINANCE */:
case 0x1902 /* GL_DEPTH_COMPONENT */:
case 0x1903 /* GL_RED */:
case 0x8D94 /* GL_RED_INTEGER */:
numChannels = 1;
break;
case 0x190A /* GL_LUMINANCE_ALPHA */:
case 0x8227 /* GL_RG */:
case 0x8228 /* GL_RG_INTEGER*/:
numChannels = 2;
break;
case 0x1907 /* GL_RGB */:
case 0x8C40 /* GL_SRGB_EXT */:
case 0x8D98 /* GL_RGB_INTEGER */:
numChannels = 3;
break;
case 0x1908 /* GL_RGBA */:
case 0x8C42 /* GL_SRGB_ALPHA_EXT */:
case 0x8D99 /* GL_RGBA_INTEGER */:
numChannels = 4;
break;
default:
GL.recordError(0x0500); // GL_INVALID_ENUM
return null;
}
switch (type) {
case 0x1401 /* GL_UNSIGNED_BYTE */:
case 0x1400 /* GL_BYTE */:
sizePerPixel = numChannels*1;
break;
case 0x1403 /* GL_UNSIGNED_SHORT */:
case 0x8D61 /* GL_HALF_FLOAT_OES */:
case 0x140B /* GL_HALF_FLOAT */:
case 0x1402 /* GL_SHORT */:
sizePerPixel = numChannels*2;
break;
case 0x1405 /* GL_UNSIGNED_INT */:
case 0x1406 /* GL_FLOAT */:
case 0x1404 /* GL_INT */:
sizePerPixel = numChannels*4;
break;
case 0x84FA /* GL_UNSIGNED_INT_24_8_WEBGL/GL_UNSIGNED_INT_24_8 */:
case 0x8C3E /* GL_UNSIGNED_INT_5_9_9_9_REV */:
case 0x8368 /* GL_UNSIGNED_INT_2_10_10_10_REV */:
case 0x8C3B /* GL_UNSIGNED_INT_10F_11F_11F_REV */:
case 0x84FA /* GL_UNSIGNED_INT_24_8 */:
sizePerPixel = 4;
break;
case 0x8363 /* GL_UNSIGNED_SHORT_5_6_5 */:
case 0x8033 /* GL_UNSIGNED_SHORT_4_4_4_4 */:
case 0x8034 /* GL_UNSIGNED_SHORT_5_5_5_1 */:
sizePerPixel = 2;
break;
default:
GL.recordError(0x0500); // GL_INVALID_ENUM
return null;
}
var bytes = emscriptenWebGLComputeImageSize(width, height, sizePerPixel, GL.unpackAlignment);
switch(type) {
case 0x1400 /* GL_BYTE */:
return HEAP8.subarray((pixels),(pixels+bytes));
case 0x1401 /* GL_UNSIGNED_BYTE */:
return HEAPU8.subarray((pixels),(pixels+bytes));
case 0x1402 /* GL_SHORT */:
return HEAP16.subarray((pixels)>>1,(pixels+bytes)>>1);
case 0x1404 /* GL_INT */:
return HEAP32.subarray((pixels)>>2,(pixels+bytes)>>2);
case 0x1406 /* GL_FLOAT */:
return HEAPF32.subarray((pixels)>>2,(pixels+bytes)>>2);
case 0x1405 /* GL_UNSIGNED_INT */:
case 0x84FA /* GL_UNSIGNED_INT_24_8_WEBGL/GL_UNSIGNED_INT_24_8 */:
case 0x8C3E /* GL_UNSIGNED_INT_5_9_9_9_REV */:
case 0x8368 /* GL_UNSIGNED_INT_2_10_10_10_REV */:
case 0x8C3B /* GL_UNSIGNED_INT_10F_11F_11F_REV */:
case 0x84FA /* GL_UNSIGNED_INT_24_8 */:
return HEAPU32.subarray((pixels)>>2,(pixels+bytes)>>2);
case 0x1403 /* GL_UNSIGNED_SHORT */:
case 0x8363 /* GL_UNSIGNED_SHORT_5_6_5 */:
case 0x8033 /* GL_UNSIGNED_SHORT_4_4_4_4 */:
case 0x8034 /* GL_UNSIGNED_SHORT_5_5_5_1 */:
case 0x8D61 /* GL_HALF_FLOAT_OES */:
case 0x140B /* GL_HALF_FLOAT */:
return HEAPU16.subarray((pixels)>>1,(pixels+bytes)>>1);
default:
GL.recordError(0x0500); // GL_INVALID_ENUM
return null;
}
}function _emscripten_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels) {
var pixelData = null;
if (pixels) pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, 0);
GLctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixelData);
}
function _emscripten_glUniform2f(location, v0, v1) {
location = GL.uniforms[location];
GLctx.uniform2f(location, v0, v1);
}
function _glGetAttribLocation(program, name) {
program = GL.programs[program];
name = Pointer_stringify(name);
return GLctx.getAttribLocation(program, name);
}
function _emscripten_glUniform2i(location, v0, v1) {
location = GL.uniforms[location];
GLctx.uniform2i(location, v0, v1);
}
function _emscripten_glDeleteRenderbuffers(n, renderbuffers) {
for (var i = 0; i < n; i++) {
var id = HEAP32[(((renderbuffers)+(i*4))>>2)];
var renderbuffer = GL.renderbuffers[id];
if (!renderbuffer) continue; // GL spec: "glDeleteRenderbuffers silently ignores 0s and names that do not correspond to existing renderbuffer objects".
GLctx.deleteRenderbuffer(renderbuffer);
renderbuffer.name = 0;
GL.renderbuffers[id] = null;
}
}
function ___cxa_pure_virtual() {
ABORT = true;
throw 'Pure virtual function called!';
}
var _environ=STATICTOP; STATICTOP += 16;;var ___environ=_environ;function ___buildEnvironment(env) {
// WARNING: Arbitrary limit!
var MAX_ENV_VALUES = 64;
var TOTAL_ENV_SIZE = 1024;
// Statically allocate memory for the environment.
var poolPtr;
var envPtr;
if (!___buildEnvironment.called) {
___buildEnvironment.called = true;
// Set default values. Use string keys for Closure Compiler compatibility.
ENV['USER'] = ENV['LOGNAME'] = 'web_user';
ENV['PATH'] = '/';
ENV['PWD'] = '/';
ENV['HOME'] = '/home/web_user';
ENV['LANG'] = 'C';
ENV['_'] = Module['thisProgram'];
// Allocate memory.
poolPtr = allocate(TOTAL_ENV_SIZE, 'i8', ALLOC_STATIC);
envPtr = allocate(MAX_ENV_VALUES * 4,
'i8*', ALLOC_STATIC);
HEAP32[((envPtr)>>2)]=poolPtr;
HEAP32[((_environ)>>2)]=envPtr;
} else {
envPtr = HEAP32[((_environ)>>2)];
poolPtr = HEAP32[((envPtr)>>2)];
}
// Collect key=value lines.
var strings = [];
var totalSize = 0;
for (var key in env) {
if (typeof env[key] === 'string') {
var line = key + '=' + env[key];
strings.push(line);
totalSize += line.length;
}
}
if (totalSize > TOTAL_ENV_SIZE) {
throw new Error('Environment size exceeded TOTAL_ENV_SIZE!');
}
// Make new.
var ptrSize = 4;
for (var i = 0; i < strings.length; i++) {
var line = strings[i];
writeAsciiToMemory(line, poolPtr);
HEAP32[(((envPtr)+(i * ptrSize))>>2)]=poolPtr;
poolPtr += line.length + 1;
}
HEAP32[(((envPtr)+(strings.length * ptrSize))>>2)]=0;
}var ENV={};function _unsetenv(name) {
// int unsetenv(const char *name);
// http://pubs.opengroup.org/onlinepubs/009695399/functions/unsetenv.html
if (name === 0) {
___setErrNo(ERRNO_CODES.EINVAL);
return -1;
}
name = Pointer_stringify(name);
if (name === '' || name.indexOf('=') !== -1) {
___setErrNo(ERRNO_CODES.EINVAL);
return -1;
}
if (ENV.hasOwnProperty(name)) {
delete ENV[name];
___buildEnvironment(ENV);
}
return 0;
}
function _emscripten_set_mousedown_callback(target, userData, useCapture, callbackfunc) {
JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, 5, "mousedown");
return 0;
}
function _emscripten_glDepthRange(x0, x1) { GLctx['depthRange'](x0, x1) }
function _emscripten_set_fullscreenchange_callback(target, userData, useCapture, callbackfunc) {
if (typeof JSEvents.fullscreenEnabled() === 'undefined') return -1;
if (!target) target = document;
else {
target = JSEvents.findEventTarget(target);
if (!target) return -4;
}
JSEvents.registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "fullscreenchange");
JSEvents.registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "mozfullscreenchange");
JSEvents.registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "webkitfullscreenchange");
JSEvents.registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "msfullscreenchange");
return 0;
}
function _glPolygonOffset(x0, x1) { GLctx['polygonOffset'](x0, x1) }
function _JS_WebRequest_SetProgressHandler(request, arg, onprogress)
{
var http = wr.requestInstances[request];
http.onprogress = function http_onprogress(e) {
if (onprogress)
{
if (e.lengthComputable)
Runtime.dynCall('viii', onprogress, [arg, e.loaded, e.total]);
}
};
}
function _emscripten_glGetShaderPrecisionFormat(shaderType, precisionType, range, precision) {
var result = GLctx.getShaderPrecisionFormat(shaderType, precisionType);
HEAP32[((range)>>2)]=result.rangeMin;
HEAP32[(((range)+(4))>>2)]=result.rangeMax;
HEAP32[((precision)>>2)]=result.precision;
}
function _JS_WebRequest_GetStatusLine(request, buffer, bufferSize)
{
var status = wr.requestInstances[request].status + " " + wr.requestInstances[request].statusText;
if (buffer)
stringToUTF8(status, buffer, bufferSize);
return lengthBytesUTF8(status);
}
function _emscripten_set_wheel_callback(target, userData, useCapture, callbackfunc) {
target = JSEvents.findEventTarget(target);
if (typeof target.onwheel !== 'undefined') {
JSEvents.registerWheelEventCallback(target, userData, useCapture, callbackfunc, 9, "wheel");
return 0;
} else if (typeof target.onmousewheel !== 'undefined') {
JSEvents.registerWheelEventCallback(target, userData, useCapture, callbackfunc, 9, "mousewheel");
return 0;
} else {
return -1;
}
}
function _glDrawElementsInstanced(mode, count, type, indices, primcount) {
GLctx['drawElementsInstanced'](mode, count, type, indices, primcount);
}
function _emscripten_glBindProgramARB() {
Module['printErr']('missing function: emscripten_glBindProgramARB'); abort(-1);
}
function _emscripten_glVertexAttrib3fv(index, v) {
var view = GL.miniTempBufferViews[2];
view[0] = HEAPF32[v >> 2];
view[1] = HEAPF32[v + 4 >> 2];
view[2] = HEAPF32[v + 8 >> 2];
GLctx.vertexAttrib3fv(index, view);
}
function _glFlush() { GLctx['flush']() }
function _emscripten_glIsFramebuffer(framebuffer) {
var fb = GL.framebuffers[framebuffer];
if (!fb) return 0;
return GLctx.isFramebuffer(fb);
}
function ___syscall193(which, varargs) {SYSCALLS.varargs = varargs;
try {
// truncate64
var path = SYSCALLS.getStr(), zero = SYSCALLS.getZero(), length = SYSCALLS.get64();
FS.truncate(path, length);
return 0;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall192(which, varargs) {SYSCALLS.varargs = varargs;
try {
// mmap2
var addr = SYSCALLS.get(), len = SYSCALLS.get(), prot = SYSCALLS.get(), flags = SYSCALLS.get(), fd = SYSCALLS.get(), off = SYSCALLS.get()
off <<= 12; // undo pgoffset
var ptr;
var allocated = false;
if (fd === -1) {
ptr = _memalign(PAGE_SIZE, len);
if (!ptr) return -ERRNO_CODES.ENOMEM;
_memset(ptr, 0, len);
allocated = true;
} else {
var info = FS.getStream(fd);
if (!info) return -ERRNO_CODES.EBADF;
var res = FS.mmap(info, HEAPU8, addr, len, off, prot, flags);
ptr = res.ptr;
allocated = res.allocated;
}
SYSCALLS.mappings[ptr] = { malloc: ptr, len: len, allocated: allocated, fd: fd, flags: flags };
return ptr;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall195(which, varargs) {SYSCALLS.varargs = varargs;
try {
// SYS_stat64
var path = SYSCALLS.getStr(), buf = SYSCALLS.get();
return SYSCALLS.doStat(FS.stat, path, buf);
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall194(which, varargs) {SYSCALLS.varargs = varargs;
try {
// ftruncate64
var fd = SYSCALLS.get(), zero = SYSCALLS.getZero(), length = SYSCALLS.get64();
FS.ftruncate(fd, length);
return 0;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall197(which, varargs) {SYSCALLS.varargs = varargs;
try {
// SYS_fstat64
var stream = SYSCALLS.getStreamFromFD(), buf = SYSCALLS.get();
return SYSCALLS.doStat(FS.stat, stream.path, buf);
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall196(which, varargs) {SYSCALLS.varargs = varargs;
try {
// SYS_lstat64
var path = SYSCALLS.getStr(), buf = SYSCALLS.get();
return SYSCALLS.doStat(FS.lstat, path, buf);
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall202(which, varargs) {SYSCALLS.varargs = varargs;
try {
// getgid32
return 0;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}function ___syscall199() {
return ___syscall202.apply(null, arguments)
}
function _emscripten_glRotatef() {
Module['printErr']('missing function: emscripten_glRotatef'); abort(-1);
}
function _glFenceSync(condition, flags) {
var sync = GLctx.fenceSync(condition, flags);
if (sync) {
var id = GL.getNewId(GL.syncs);
sync.name = id;
GL.syncs[id] = sync;
return id;
} else {
return 0; // Failed to create a sync object
}
}
function _glBlendEquationSeparate(x0, x1) { GLctx['blendEquationSeparate'](x0, x1) }
function _emscripten_glGetActiveUniform(program, index, bufSize, length, size, type, name) {
program = GL.programs[program];
var info = GLctx.getActiveUniform(program, index);
if (!info) return; // If an error occurs, nothing will be written to length, size, type and name.
if (bufSize > 0 && name) {
var numBytesWrittenExclNull = stringToUTF8(info.name, name, bufSize);
if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull;
} else {
if (length) HEAP32[((length)>>2)]=0;
}
if (size) HEAP32[((size)>>2)]=info.size;
if (type) HEAP32[((type)>>2)]=info.type;
}
function _emscripten_set_focus_callback(target, userData, useCapture, callbackfunc) {
JSEvents.registerFocusEventCallback(target, userData, useCapture, callbackfunc, 13, "focus");
return 0;
}
function _emscripten_glGetShaderInfoLog(shader, maxLength, length, infoLog) {
var log = GLctx.getShaderInfoLog(GL.shaders[shader]);
if (log === null) log = '(unknown error)';
if (maxLength > 0 && infoLog) {
var numBytesWrittenExclNull = stringToUTF8(log, infoLog, maxLength);
if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull;
} else {
if (length) HEAP32[((length)>>2)]=0;
}
}
function _emscripten_set_mouseup_callback(target, userData, useCapture, callbackfunc) {
JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, 6, "mouseup");
return 0;
}
function _emscripten_glStencilOpSeparate(x0, x1, x2, x3) { GLctx['stencilOpSeparate'](x0, x1, x2, x3) }
function _emscripten_glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data) {
var heapView;
if (data) {
heapView = HEAPU8.subarray((data),(data+imageSize));
} else {
heapView = null;
}
GLctx['compressedTexSubImage2D'](target, level, xoffset, yoffset, width, height, format, heapView);
}
function _glStencilFuncSeparate(x0, x1, x2, x3) { GLctx['stencilFuncSeparate'](x0, x1, x2, x3) }
function _glGenSamplers(n, samplers) {
for (var i = 0; i < n; i++) {
var sampler = GLctx['createSampler']();
if (!sampler) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
while(i < n) HEAP32[(((samplers)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.samplers);
sampler.name = id;
GL.samplers[id] = sampler;
HEAP32[(((samplers)+(i*4))>>2)]=id;
}
}
function _pthread_cleanup_push(routine, arg) {
__ATEXIT__.push(function() { Module['dynCall_vi'](routine, arg) })
_pthread_cleanup_push.level = __ATEXIT__.length;
}
function _emscripten_glIsEnabled(x0) { return GLctx['isEnabled'](x0) }
function _glUniform4iv(location, count, value) {
location = GL.uniforms[location];
count *= 4;
value = HEAP32.subarray((value)>>2,(value+count*4)>>2);
GLctx.uniform4iv(location, value);
}
function _glClearStencil(x0) { GLctx['clearStencil'](x0) }
function _JS_Sound_SetPosition(channelInstance, x, y, z)
{
if (WEBAudio.audioWebEnabled == 0)
return;
WEBAudio.audioInstances[channelInstance].panner.setPosition(x, y, z);
}
function _emscripten_glClearDepthf(x0) { GLctx['clearDepth'](x0) }
function _emscripten_glVertexAttrib4f(x0, x1, x2, x3, x4) { GLctx['vertexAttrib4f'](x0, x1, x2, x3, x4) }
function _emscripten_glClear(x0) { GLctx['clear'](x0) }
function _emscripten_get_now_is_monotonic() {
// return whether emscripten_get_now is guaranteed monotonic; the Date.now
// implementation is not :(
return ENVIRONMENT_IS_NODE || (typeof dateNow !== 'undefined') ||
((ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && self['performance'] && self['performance']['now']);
}function _clock_gettime(clk_id, tp) {
// int clock_gettime(clockid_t clk_id, struct timespec *tp);
var now;
if (clk_id === 0) {
now = Date.now();
} else if (clk_id === 1 && _emscripten_get_now_is_monotonic()) {
now = _emscripten_get_now();
} else {
___setErrNo(ERRNO_CODES.EINVAL);
return -1;
}
HEAP32[((tp)>>2)]=(now/1000)|0; // seconds
HEAP32[(((tp)+(4))>>2)]=((now % 1000)*1000*1000)|0; // nanoseconds
return 0;
}
function _glDeleteRenderbuffers(n, renderbuffers) {
for (var i = 0; i < n; i++) {
var id = HEAP32[(((renderbuffers)+(i*4))>>2)];
var renderbuffer = GL.renderbuffers[id];
if (!renderbuffer) continue; // GL spec: "glDeleteRenderbuffers silently ignores 0s and names that do not correspond to existing renderbuffer objects".
GLctx.deleteRenderbuffer(renderbuffer);
renderbuffer.name = 0;
GL.renderbuffers[id] = null;
}
}
function _glGetProgramiv(program, pname, p) {
if (!p) {
// GLES2 specification does not specify how to behave if p is a null pointer. Since calling this function does not make sense
// if p == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
if (program >= GL.counter) {
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
var ptable = GL.programInfos[program];
if (!ptable) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
return;
}
if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH
var log = GLctx.getProgramInfoLog(GL.programs[program]);
if (log === null) log = '(unknown error)';
HEAP32[((p)>>2)]=log.length + 1;
} else if (pname == 0x8B87 /* GL_ACTIVE_UNIFORM_MAX_LENGTH */) {
HEAP32[((p)>>2)]=ptable.maxUniformLength;
} else if (pname == 0x8B8A /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */) {
if (ptable.maxAttributeLength == -1) {
var program = GL.programs[program];
var numAttribs = GLctx.getProgramParameter(program, GLctx.ACTIVE_ATTRIBUTES);
ptable.maxAttributeLength = 0; // Spec says if there are no active attribs, 0 must be returned.
for (var i = 0; i < numAttribs; ++i) {
var activeAttrib = GLctx.getActiveAttrib(program, i);
ptable.maxAttributeLength = Math.max(ptable.maxAttributeLength, activeAttrib.name.length+1);
}
}
HEAP32[((p)>>2)]=ptable.maxAttributeLength;
} else if (pname == 0x8A35 /* GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */) {
if (ptable.maxUniformBlockNameLength == -1) {
var program = GL.programs[program];
var numBlocks = GLctx.getProgramParameter(program, GLctx.ACTIVE_UNIFORM_BLOCKS);
ptable.maxUniformBlockNameLength = 0;
for (var i = 0; i < numBlocks; ++i) {
var activeBlockName = GLctx.getActiveUniformBlockName(program, i);
ptable.maxUniformBlockNameLength = Math.max(ptable.maxUniformBlockNameLength, activeBlockName.length+1);
}
}
HEAP32[((p)>>2)]=ptable.maxUniformBlockNameLength;
} else {
HEAP32[((p)>>2)]=GLctx.getProgramParameter(GL.programs[program], pname);
}
}
function _glVertexAttribPointer(index, size, type, normalized, stride, ptr) {
GLctx.vertexAttribPointer(index, size, type, !!normalized, stride, ptr);
}
function _pthread_cond_signal() { return 0; }
function _glFramebufferTextureLayer(target, attachment, texture, level, layer) {
GLctx.framebufferTextureLayer(target, attachment, GL.textures[texture], level, layer);
}
function _emscripten_glGetAttachedShaders(program, maxCount, count, shaders) {
var result = GLctx.getAttachedShaders(GL.programs[program]);
var len = result.length;
if (len > maxCount) {
len = maxCount;
}
HEAP32[((count)>>2)]=len;
for (var i = 0; i < len; ++i) {
var id = GL.shaders.indexOf(result[i]);
HEAP32[(((shaders)+(i*4))>>2)]=id;
}
}
function _flock(fd, operation) {
// int flock(int fd, int operation);
// Pretend to succeed
return 0;
}
function _emscripten_glFrontFace(x0) { GLctx['frontFace'](x0) }
function _emscripten_glActiveTexture(x0) { GLctx['activeTexture'](x0) }
function _glTexStorage2D(x0, x1, x2, x3, x4) { GLctx['texStorage2D'](x0, x1, x2, x3, x4) }
function _emscripten_glGetInfoLogARB() {
Module['printErr']('missing function: emscripten_glGetInfoLogARB'); abort(-1);
}
function _pthread_key_delete(key) {
if (key in PTHREAD_SPECIFIC) {
delete PTHREAD_SPECIFIC[key];
return 0;
}
return ERRNO_CODES.EINVAL;
}
function _glGenQueries(n, ids) {
for (var i = 0; i < n; i++) {
var query = GLctx['createQuery']();
if (!query) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
while(i < n) HEAP32[(((ids)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.queries);
query.name = id;
GL.queries[id] = query;
HEAP32[(((ids)+(i*4))>>2)]=id;
}
}
function _emscripten_glRenderbufferStorage(x0, x1, x2, x3) { GLctx['renderbufferStorage'](x0, x1, x2, x3) }
function _glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data) {
GLctx['texSubImage3D'](target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
HEAPU8.subarray(data));
}
function _glDeleteSamplers(n, samplers) {
for (var i = 0; i < n; i++) {
var id = HEAP32[(((samplers)+(i*4))>>2)];
var sampler = GL.samplers[id];
if (!sampler) continue;
GLctx['deleteSampler'](sampler);
sampler.name = 0;
GL.samplers[id] = null;
}
}
function ___syscall10(which, varargs) {SYSCALLS.varargs = varargs;
try {
// unlink
var path = SYSCALLS.getStr();
FS.unlink(path);
return 0;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _glCopyTexImage2D(x0, x1, x2, x3, x4, x5, x6, x7) { GLctx['copyTexImage2D'](x0, x1, x2, x3, x4, x5, x6, x7) }
function _glBlitFramebuffer(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) { GLctx['blitFramebuffer'](x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) }
function _llvm_trap() {
abort('trap!');
}
function _emscripten_glIsProgram(program) {
var program = GL.programs[program];
if (!program) return 0;
return GLctx.isProgram(program);
}
function _emscripten_webgl_init_context_attributes(attributes) {
HEAP32[((attributes)>>2)]=1;
HEAP32[(((attributes)+(4))>>2)]=1;
HEAP32[(((attributes)+(8))>>2)]=0;
HEAP32[(((attributes)+(12))>>2)]=1;
HEAP32[(((attributes)+(16))>>2)]=1;
HEAP32[(((attributes)+(20))>>2)]=0;
HEAP32[(((attributes)+(24))>>2)]=0;
HEAP32[(((attributes)+(28))>>2)]=0;
HEAP32[(((attributes)+(32))>>2)]=1;
HEAP32[(((attributes)+(36))>>2)]=0;
HEAP32[(((attributes)+(40))>>2)]=1;
HEAP32[(((attributes)+(44))>>2)]=0;
}
function _emscripten_glGenBuffers(n, buffers) {
for (var i = 0; i < n; i++) {
var buffer = GLctx.createBuffer();
if (!buffer) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
while(i < n) HEAP32[(((buffers)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.buffers);
buffer.name = id;
GL.buffers[id] = buffer;
HEAP32[(((buffers)+(i*4))>>2)]=id;
}
}
function _JS_Sound_SetLoopPoints(channelInstance, loopStart, loopEnd)
{
if (WEBAudio.audioWebEnabled == 0)
return;
var channel = WEBAudio.audioInstances[channelInstance];
channel.source.loopStart = loopStart;
channel.source.loopEnd = loopEnd;
}
function _emscripten_glGetShaderiv(shader, pname, p) {
if (!p) {
// GLES2 specification does not specify how to behave if p is a null pointer. Since calling this function does not make sense
// if p == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH
var log = GLctx.getShaderInfoLog(GL.shaders[shader]);
if (log === null) log = '(unknown error)';
HEAP32[((p)>>2)]=log.length + 1;
} else {
HEAP32[((p)>>2)]=GLctx.getShaderParameter(GL.shaders[shader], pname);
}
}
function _emscripten_glUniformMatrix3fv(location, count, transpose, value) {
location = GL.uniforms[location];
var view;
if (9*count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[9*count-1];
for (var i = 0; i < 9*count; i += 9) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)];
view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)];
view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)];
view[i+4] = HEAPF32[(((value)+(4*i+16))>>2)];
view[i+5] = HEAPF32[(((value)+(4*i+20))>>2)];
view[i+6] = HEAPF32[(((value)+(4*i+24))>>2)];
view[i+7] = HEAPF32[(((value)+(4*i+28))>>2)];
view[i+8] = HEAPF32[(((value)+(4*i+32))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*36)>>2);
}
GLctx.uniformMatrix3fv(location, !!transpose, view);
}
Module["_testSetjmp"] = _testSetjmp;
function _JS_SystemInfo_GetCurrentCanvasWidth()
{
return Module['canvas'].clientWidth;
}
function _glUniform4uiv(location, count, value) {
location = GL.uniforms[location];
count *= 4;
value = HEAPU32.subarray((value)>>2,(value+count*4)>>2);
GLctx.uniform4uiv(location, value);
}
function _emscripten_glGenFramebuffers(n, ids) {
for (var i = 0; i < n; ++i) {
var framebuffer = GLctx.createFramebuffer();
if (!framebuffer) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
while(i < n) HEAP32[(((ids)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.framebuffers);
framebuffer.name = id;
GL.framebuffers[id] = framebuffer;
HEAP32[(((ids)+(i*4))>>2)]=id;
}
}
function _JS_Sound_Play(bufferInstance, channelInstance, offset, delay)
{
// stop sound which is playing in the channel currently.
_JS_Sound_Stop (channelInstance, 0);
if (WEBAudio.audioWebEnabled == 0)
return;
var sound = WEBAudio.audioInstances[bufferInstance];
var channel = WEBAudio.audioInstances[channelInstance];
if (sound.buffer)
channel.playBuffer (WEBAudio.audioContext.currentTime + delay, sound.buffer, offset);
else
console.log ("Trying to play sound which is not loaded.")
}
function _glGetShaderiv(shader, pname, p) {
if (!p) {
// GLES2 specification does not specify how to behave if p is a null pointer. Since calling this function does not make sense
// if p == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH
var log = GLctx.getShaderInfoLog(GL.shaders[shader]);
if (log === null) log = '(unknown error)';
HEAP32[((p)>>2)]=log.length + 1;
} else {
HEAP32[((p)>>2)]=GLctx.getShaderParameter(GL.shaders[shader], pname);
}
}
function _emscripten_glBlendEquationSeparate(x0, x1) { GLctx['blendEquationSeparate'](x0, x1) }
function _emscripten_glDrawElements(mode, count, type, indices) {
GLctx.drawElements(mode, count, type, indices);
}function _emscripten_glDrawRangeElements(mode, start, end, count, type, indices) {
// TODO: This should be a trivial pass-though function, but due to https://bugzilla.mozilla.org/show_bug.cgi?id=1202427,
// we work around by ignoring the range.
_emscripten_glDrawElements(mode, count, type, indices);
GLctx.drawElements(mode, count, type, indices);
}
function _glGenRenderbuffers(n, renderbuffers) {
for (var i = 0; i < n; i++) {
var renderbuffer = GLctx.createRenderbuffer();
if (!renderbuffer) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
while(i < n) HEAP32[(((renderbuffers)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.renderbuffers);
renderbuffer.name = id;
GL.renderbuffers[id] = renderbuffer;
HEAP32[(((renderbuffers)+(i*4))>>2)]=id;
}
}
function _emscripten_glGenTextures(n, textures) {
for (var i = 0; i < n; i++) {
var texture = GLctx.createTexture();
if (!texture) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */); // GLES + EGL specs don't specify what should happen here, so best to issue an error and create IDs with 0.
while(i < n) HEAP32[(((textures)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.textures);
texture.name = id;
GL.textures[id] = texture;
HEAP32[(((textures)+(i*4))>>2)]=id;
}
}
function _emscripten_glReleaseShaderCompiler() {
// NOP (as allowed by GLES 2.0 spec)
}
function _glCopyTexSubImage2D(x0, x1, x2, x3, x4, x5, x6, x7) { GLctx['copyTexSubImage2D'](x0, x1, x2, x3, x4, x5, x6, x7) }
function _JS_Sound_ReleaseInstance(instance)
{
WEBAudio.audioInstances[instance] = null;
}
function _emscripten_glDrawArrays(mode, first, count) {
GLctx.drawArrays(mode, first, count);
}
function _emscripten_glClearDepth(x0) { GLctx['clearDepth'](x0) }
var fs={numPendingSync:0,syncIntervalID:0,syncInProgress:false,sync:function (onlyPendingSync)
{
if (onlyPendingSync) {
if (fs.numPendingSync == 0)
return;
}
else if (fs.syncInProgress) {
// this is to avoid indexedDB memory leak when FS.syncfs is executed before the previous one completed.
fs.numPendingSync++;
return;
}
fs.syncInProgress = true;
FS.syncfs(false, (function(err) {
fs.syncInProgress = false;
}));
fs.numPendingSync = 0;
}};function _JS_FileSystem_SetSyncInterval(ms)
{
if (!Module.indexedDB)
return;
fs.syncIntervalID = window.setInterval(function(){
fs.sync(true);
}, ms);
}
function _emscripten_glGetUniformLocation(program, name) {
name = Pointer_stringify(name);
var arrayOffset = 0;
// If user passed an array accessor "[index]", parse the array index off the accessor.
if (name.indexOf(']', name.length-1) !== -1) {
var ls = name.lastIndexOf('[');
var arrayIndex = name.slice(ls+1, -1);
if (arrayIndex.length > 0) {
arrayOffset = parseInt(arrayIndex);
if (arrayOffset < 0) {
return -1;
}
}
name = name.slice(0, ls);
}
var ptable = GL.programInfos[program];
if (!ptable) {
return -1;
}
var utable = ptable.uniforms;
var uniformInfo = utable[name]; // returns pair [ dimension_of_uniform_array, uniform_location ]
if (uniformInfo && arrayOffset < uniformInfo[0]) { // Check if user asked for an out-of-bounds element, i.e. for 'vec4 colors[3];' user could ask for 'colors[10]' which should return -1.
return uniformInfo[1]+arrayOffset;
} else {
return -1;
}
}
function _glUniform3fv(location, count, value) {
location = GL.uniforms[location];
var view;
if (3*count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[3*count-1];
for (var i = 0; i < 3*count; i += 3) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)];
view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*12)>>2);
}
GLctx.uniform3fv(location, view);
}
function _emscripten_glVertexAttrib4fv(index, v) {
var view = GL.miniTempBufferViews[3];
view[0] = HEAPF32[v >> 2];
view[1] = HEAPF32[v + 4 >> 2];
view[2] = HEAPF32[v + 8 >> 2];
view[3] = HEAPF32[v + 12 >> 2];
GLctx.vertexAttrib4fv(index, view);
}
function _emscripten_glScissor(x0, x1, x2, x3) { GLctx['scissor'](x0, x1, x2, x3) }
function _JS_Sound_Set3D(channelInstance, threeD)
{
var channel = WEBAudio.audioInstances[channelInstance];
if (channel.threeD != threeD)
{
channel.threeD = threeD;
channel.setupPanning();
}
}
function _JS_SystemInfo_GetDocumentURL(buffer, bufferSize)
{
if (buffer)
stringToUTF8(document.URL, buffer, bufferSize);
return lengthBytesUTF8(document.URL);
}
function _emscripten_glLinkProgram(program) {
GLctx.linkProgram(GL.programs[program]);
GL.programInfos[program] = null; // uniforms no longer keep the same names after linking
GL.populateUniformTable(program);
}
function _JS_Sound_GetLength(bufferInstance)
{
if (WEBAudio.audioWebEnabled == 0)
return 0;
var sound = WEBAudio.audioInstances[bufferInstance];
// Fakemod assumes sample rate is 44100, though that's not necessarily the case,
// depending on OS, if the audio file was not imported by our pipeline.
// Therefore we need to recalculate the length based on the actual samplerate.
var sampleRateRatio = 44100 / sound.buffer.sampleRate;
return sound.buffer.length * sampleRateRatio;
}
function _JS_Sound_Create_Channel(callback, userData)
{
if (WEBAudio.audioWebEnabled == 0)
return;
var channel = {
gain: WEBAudio.audioContext.createGain(),
panner: WEBAudio.audioContext.createPanner(),
threeD: false,
playBuffer: function(delay, buffer, offset)
{
this.source.buffer = buffer;
var chan = this;
this.source.onended = function()
{
if (callback)
Runtime.dynCall('vi', callback, [userData]);
// recreate channel for future use.
chan.setup();
};
this.source.start(delay, offset);
},
setup: function()
{
this.source = WEBAudio.audioContext.createBufferSource();
this.setupPanning();
},
setupPanning: function()
{
if(this.threeD)
{
this.source.disconnect();
this.source.connect(this.panner);
this.panner.connect(this.gain);
}
else
{
this.panner.disconnect();
this.source.connect(this.gain);
}
}
};
channel.panner.rolloffFactor = 0; // We calculate rolloff ourselves.
channel.gain.connect ( WEBAudio.audioContext.destination);
channel.setup();
return WEBAudio.audioInstances.push(channel) - 1;
}
function _glDeleteSync(id) {
if (!id) return;
var sync = GL.syncs[id];
if (!sync) { // glDeleteSync signals an error when deleting a nonexisting object, unlike some other GL delete functions.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
GLctx.deleteSync(sync);
sync.name = 0;
GL.syncs[id] = null;
}
function _realloc() { throw 'bad' }
Module["_realloc"] = _realloc;
Module["_saveSetjmp"] = _saveSetjmp;function _longjmp(env, value) {
asm['setThrew'](env, value || 1);
throw 'longjmp';
}function _emscripten_longjmp(env, value) {
_longjmp(env, value);
}
function _glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName) {
program = GL.programs[program];
var result = GLctx['getActiveUniformBlockName'](program, uniformBlockIndex);
if (!result) return; // If an error occurs, nothing will be written to uniformBlockName or length.
if (uniformBlockName && bufSize > 0) {
var numBytesWrittenExclNull = stringToUTF8(result, uniformBlockName, bufSize);
if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull;
} else {
if (length) HEAP32[((length)>>2)]=0;
}
}
function emscriptenWebGLGetVertexAttrib(index, pname, params, type) {
if (!params) {
// GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense
// if params == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
var data = GLctx.getVertexAttrib(index, pname);
if (pname == 0x889F/*VERTEX_ATTRIB_ARRAY_BUFFER_BINDING*/) {
HEAP32[((params)>>2)]=data["name"];
} else if (typeof data == 'number' || typeof data == 'boolean') {
switch (type) {
case 'Integer': HEAP32[((params)>>2)]=data; break;
case 'Float': HEAPF32[((params)>>2)]=data; break;
case 'FloatToInteger': HEAP32[((params)>>2)]=Math.fround(data); break;
default: throw 'internal emscriptenWebGLGetVertexAttrib() error, bad type: ' + type;
}
} else {
for (var i = 0; i < data.length; i++) {
switch (type) {
case 'Integer': HEAP32[(((params)+(i))>>2)]=data[i]; break;
case 'Float': HEAPF32[(((params)+(i))>>2)]=data[i]; break;
case 'FloatToInteger': HEAP32[(((params)+(i))>>2)]=Math.fround(data[i]); break;
default: throw 'internal emscriptenWebGLGetVertexAttrib() error, bad type: ' + type;
}
}
}
}function _glGetVertexAttribiv(index, pname, params) {
// N.B. This function may only be called if the vertex attribute was specified using the function glVertexAttrib*f(),
// otherwise the results are undefined. (GLES3 spec 6.1.12)
emscriptenWebGLGetVertexAttrib(index, pname, params, 'FloatToInteger');
}
function _JS_FileSystem_Sync()
{
if (!Module.indexedDB)
return;
fs.sync(false);
}
function _emscripten_glEnable(x0) { GLctx['enable'](x0) }
function _emscripten_glBufferData(target, size, data, usage) {
switch (usage) { // fix usages, WebGL only has *_DRAW
case 0x88E1: // GL_STREAM_READ
case 0x88E2: // GL_STREAM_COPY
usage = 0x88E0; // GL_STREAM_DRAW
break;
case 0x88E5: // GL_STATIC_READ
case 0x88E6: // GL_STATIC_COPY
usage = 0x88E4; // GL_STATIC_DRAW
break;
case 0x88E9: // GL_DYNAMIC_READ
case 0x88EA: // GL_DYNAMIC_COPY
usage = 0x88E8; // GL_DYNAMIC_DRAW
break;
}
if (!data) {
GLctx.bufferData(target, size, usage);
} else {
GLctx.bufferData(target, HEAPU8.subarray(data, data+size), usage);
}
}
function _glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params) {
if (!params) {
// GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense
// if params == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
program = GL.programs[program];
switch(pname) {
case 0x8A41: /* GL_UNIFORM_BLOCK_NAME_LENGTH */
var name = GLctx['getActiveUniformBlockName'](program, uniformBlockIndex);
HEAP32[((params)>>2)]=name.length+1;
return;
default:
var result = GLctx['getActiveUniformBlockParameter'](program, uniformBlockIndex, pname);
if (!result) return; // If an error occurs, nothing will be written to params.
if (typeof result == 'number') {
HEAP32[((params)>>2)]=result;
} else {
for (var i = 0; i < result.length; i++) {
HEAP32[(((params)+(i*4))>>2)]=result[i];
}
}
}
}
function _emscripten_glGetShaderSource(shader, bufSize, length, source) {
var result = GLctx.getShaderSource(GL.shaders[shader]);
if (!result) return; // If an error occurs, nothing will be written to length or source.
if (bufSize > 0 && source) {
var numBytesWrittenExclNull = stringToUTF8(result, source, bufSize);
if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull;
} else {
if (length) HEAP32[((length)>>2)]=0;
}
}
Module["_llvm_bswap_i32"] = _llvm_bswap_i32;
function _JS_Sound_GetLoadState(bufferInstance)
{
if (WEBAudio.audioWebEnabled == 0)
return 2;
var sound = WEBAudio.audioInstances[bufferInstance];
if (sound.error)
return 2;
if (sound.buffer)
return 0;
return 1;
}
function _JS_Sound_SetPitch(channelInstance, v)
{
if (WEBAudio.audioWebEnabled == 0)
return;
WEBAudio.audioInstances[channelInstance].source.playbackRate.value = v;
}
function emscriptenWebGLGet(name_, p, type) {
// Guard against user passing a null pointer.
// Note that GLES2 spec does not say anything about how passing a null pointer should be treated.
// Testing on desktop core GL 3, the application crashes on glGetIntegerv to a null pointer, but
// better to report an error instead of doing anything random.
if (!p) {
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
var ret = undefined;
switch(name_) { // Handle a few trivial GLES values
case 0x8DFA: // GL_SHADER_COMPILER
ret = 1;
break;
case 0x8DF8: // GL_SHADER_BINARY_FORMATS
if (type !== 'Integer' && type !== 'Integer64') {
GL.recordError(0x0500); // GL_INVALID_ENUM
}
return; // Do not write anything to the out pointer, since no binary formats are supported.
case 0x87FE: // GL_NUM_PROGRAM_BINARY_FORMATS
case 0x8DF9: // GL_NUM_SHADER_BINARY_FORMATS
ret = 0;
break;
case 0x86A2: // GL_NUM_COMPRESSED_TEXTURE_FORMATS
// WebGL doesn't have GL_NUM_COMPRESSED_TEXTURE_FORMATS (it's obsolete since GL_COMPRESSED_TEXTURE_FORMATS returns a JS array that can be queried for length),
// so implement it ourselves to allow C++ GLES2 code get the length.
var formats = GLctx.getParameter(0x86A3 /*GL_COMPRESSED_TEXTURE_FORMATS*/);
ret = formats.length;
break;
case 0x821D: // GL_NUM_EXTENSIONS
if (GLctx.canvas.GLctxObject.version < 2) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */); // Calling GLES3/WebGL2 function with a GLES2/WebGL1 context
return;
}
var exts = GLctx.getSupportedExtensions();
ret = 2*exts.length; // each extension is duplicated, first in unprefixed WebGL form, and then a second time with "GL_" prefix.
break;
case 0x821B: // GL_MAJOR_VERSION
case 0x821C: // GL_MINOR_VERSION
if (GLctx.canvas.GLctxObject.version < 2) {
GL.recordError(0x0500); // GL_INVALID_ENUM
return;
}
ret = name_ == 0x821B ? 3 : 0; // return version 3.0
break;
}
if (ret === undefined) {
var result = GLctx.getParameter(name_);
switch (typeof(result)) {
case "number":
ret = result;
break;
case "boolean":
ret = result ? 1 : 0;
break;
case "string":
GL.recordError(0x0500); // GL_INVALID_ENUM
return;
case "object":
if (result === null) {
// null is a valid result for some (e.g., which buffer is bound - perhaps nothing is bound), but otherwise
// can mean an invalid name_, which we need to report as an error
switch(name_) {
case 0x8894: // ARRAY_BUFFER_BINDING
case 0x8B8D: // CURRENT_PROGRAM
case 0x8895: // ELEMENT_ARRAY_BUFFER_BINDING
case 0x8CA6: // FRAMEBUFFER_BINDING
case 0x8CA7: // RENDERBUFFER_BINDING
case 0x8069: // TEXTURE_BINDING_2D
case 0x85B5: // GL_VERTEX_ARRAY_BINDING
case 0x8919: // GL_SAMPLER_BINDING
case 0x8E25: // GL_TRANSFORM_FEEDBACK_BINDING
case 0x8514: { // TEXTURE_BINDING_CUBE_MAP
ret = 0;
break;
}
default: {
GL.recordError(0x0500); // GL_INVALID_ENUM
return;
}
}
} else if (result instanceof Float32Array ||
result instanceof Uint32Array ||
result instanceof Int32Array ||
result instanceof Array) {
for (var i = 0; i < result.length; ++i) {
switch (type) {
case 'Integer': HEAP32[(((p)+(i*4))>>2)]=result[i]; break;
case 'Float': HEAPF32[(((p)+(i*4))>>2)]=result[i]; break;
case 'Boolean': HEAP8[(((p)+(i))>>0)]=result[i] ? 1 : 0; break;
default: throw 'internal glGet error, bad type: ' + type;
}
}
return;
} else if (result instanceof WebGLBuffer ||
result instanceof WebGLProgram ||
result instanceof WebGLFramebuffer ||
result instanceof WebGLRenderbuffer ||
result instanceof WebGLQuery ||
result instanceof WebGLSampler ||
result instanceof WebGLSync ||
result instanceof WebGLTransformFeedback ||
result instanceof WebGLVertexArrayObject ||
result instanceof WebGLTexture) {
ret = result.name | 0;
} else {
GL.recordError(0x0500); // GL_INVALID_ENUM
return;
}
break;
default:
GL.recordError(0x0500); // GL_INVALID_ENUM
return;
}
}
switch (type) {
case 'Integer64': (tempI64 = [ret>>>0,(tempDouble=ret,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((p)>>2)]=tempI64[0],HEAP32[(((p)+(4))>>2)]=tempI64[1]); break;
case 'Integer': HEAP32[((p)>>2)]=ret; break;
case 'Float': HEAPF32[((p)>>2)]=ret; break;
case 'Boolean': HEAP8[((p)>>0)]=ret ? 1 : 0; break;
default: throw 'internal glGet error, bad type: ' + type;
}
}function _emscripten_glGetFloatv(name_, p) {
emscriptenWebGLGet(name_, p, 'Float');
}
function _glGetProgramInfoLog(program, maxLength, length, infoLog) {
var log = GLctx.getProgramInfoLog(GL.programs[program]);
if (log === null) log = '(unknown error)';
if (maxLength > 0 && infoLog) {
var numBytesWrittenExclNull = stringToUTF8(log, infoLog, maxLength);
if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull;
} else {
if (length) HEAP32[((length)>>2)]=0;
}
}
function _emscripten_glUniform3fv(location, count, value) {
location = GL.uniforms[location];
var view;
if (3*count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[3*count-1];
for (var i = 0; i < 3*count; i += 3) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)];
view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*12)>>2);
}
GLctx.uniform3fv(location, view);
}
function _glBindTransformFeedback(target, id) {
var transformFeedback = id ? GL.transformFeedbacks[id] : null;
if (id && !transformFeedback) { // Passing an nonexisting or an already deleted id is an error.
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
return;
}
GLctx['bindTransformFeedback'](target, transformFeedback);
}
function _glBindVertexArray(vao) {
GLctx['bindVertexArray'](GL.vaos[vao]);
}
function _emscripten_glCreateProgram() {
var id = GL.getNewId(GL.programs);
var program = GLctx.createProgram();
program.name = id;
GL.programs[id] = program;
return id;
}
function _pthread_once(ptr, func) {
if (!_pthread_once.seen) _pthread_once.seen = {};
if (ptr in _pthread_once.seen) return;
Module['dynCall_v'](func);
_pthread_once.seen[ptr] = 1;
}
function _emscripten_glCompressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, data) {
var heapView;
if (data) {
heapView = HEAPU8.subarray((data),(data+imageSize));
} else {
heapView = null;
}
GLctx['compressedTexImage2D'](target, level, internalFormat, width, height, border, heapView);
}
function _emscripten_glClearColor(x0, x1, x2, x3) { GLctx['clearColor'](x0, x1, x2, x3) }
function _glUniform2uiv(location, count, value) {
location = GL.uniforms[location];
count *= 2;
value = HEAPU32.subarray((value)>>2,(value+count*4)>>2);
GLctx.uniform2uiv(location, value);
}
function _pthread_attr_destroy(attr) {
/* int pthread_attr_destroy(pthread_attr_t *attr); */
//FIXME: should destroy the pthread_attr_t struct
return 0;
}
function _JS_SystemInfo_HasWebGL()
{
return UnityLoader.SystemInfo.hasWebGL;
}
function _glFinish() { GLctx['finish']() }
function _emscripten_glLoadMatrixf() {
Module['printErr']('missing function: emscripten_glLoadMatrixf'); abort(-1);
}
function _glDeleteShader(id) {
if (!id) return;
var shader = GL.shaders[id];
if (!shader) { // glDeleteShader actually signals an error when deleting a nonexisting object, unlike some other GL delete functions.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
GLctx.deleteShader(shader);
GL.shaders[id] = null;
}
function _emscripten_glGetProgramInfoLog(program, maxLength, length, infoLog) {
var log = GLctx.getProgramInfoLog(GL.programs[program]);
if (log === null) log = '(unknown error)';
if (maxLength > 0 && infoLog) {
var numBytesWrittenExclNull = stringToUTF8(log, infoLog, maxLength);
if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull;
} else {
if (length) HEAP32[((length)>>2)]=0;
}
}
function _glViewport(x0, x1, x2, x3) { GLctx['viewport'](x0, x1, x2, x3) }
function _emscripten_glDepthMask(flag) {
GLctx.depthMask(!!flag);
}
function _glUniform1uiv(location, count, value) {
location = GL.uniforms[location];
value = HEAPU32.subarray((value)>>2,(value+count*4)>>2);
GLctx.uniform1uiv(location, value);
}
function _glTransformFeedbackVaryings(program, count, varyings, bufferMode) {
program = GL.programs[program];
var vars = [];
for (var i = 0; i < count; i++)
vars.push(Pointer_stringify(HEAP32[(((varyings)+(i*4))>>2)]));
GLctx['transformFeedbackVaryings'](program, vars, bufferMode);
}
function _JS_Sound_Init()
{
try {
window.AudioContext = window.AudioContext||window.webkitAudioContext;
WEBAudio.audioContext = new AudioContext();
WEBAudio.audioWebEnabled = 1;
}
catch(e) {
alert('Web Audio API is not supported in this browser');
}
}
function _emscripten_glFlush() { GLctx['flush']() }
function __ZN4FMOD13DSPConnection6setMixEf() {
Module['printErr']('missing function: _ZN4FMOD13DSPConnection6setMixEf'); abort(-1);
}
function _emscripten_glCreateShader(shaderType) {
var id = GL.getNewId(GL.shaders);
GL.shaders[id] = GLctx.createShader(shaderType);
return id;
}
function _pthread_cond_init() { return 0; }
function _emscripten_glIsShader(shader) {
var s = GL.shaders[shader];
if (!s) return 0;
return GLctx.isShader(s);
}
function _JS_WebRequest_GetResponseHeaders(request, buffer, bufferSize)
{
var headers = wr.requestInstances[request].getAllResponseHeaders();
if (buffer)
stringToUTF8(headers, buffer, bufferSize);
return lengthBytesUTF8(headers);
}
function _glTexParameterf(x0, x1, x2) { GLctx['texParameterf'](x0, x1, x2) }
function _glTexParameteri(x0, x1, x2) { GLctx['texParameteri'](x0, x1, x2) }
function _emscripten_glColorMask(red, green, blue, alpha) {
GLctx.colorMask(!!red, !!green, !!blue, !!alpha);
}
function _emscripten_set_mousemove_callback(target, userData, useCapture, callbackfunc) {
JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, 8, "mousemove");
return 0;
}
function _emscripten_set_canvas_size(width, height) {
Browser.setCanvasSize(width, height);
}
function _glPixelStorei(pname, param) {
if (pname == 0x0D05 /* GL_PACK_ALIGNMENT */) {
GL.packAlignment = param;
} else if (pname == 0x0cf5 /* GL_UNPACK_ALIGNMENT */) {
GL.unpackAlignment = param;
}
GLctx.pixelStorei(pname, param);
}
function _glValidateProgram(program) {
GLctx.validateProgram(GL.programs[program]);
}
function _JS_WebRequest_Abort(request)
{
wr.requestInstances[request].abort();
}
function ___syscall221(which, varargs) {SYSCALLS.varargs = varargs;
try {
// fcntl64
var stream = SYSCALLS.getStreamFromFD(), cmd = SYSCALLS.get();
switch (cmd) {
case 0: {
var arg = SYSCALLS.get();
if (arg < 0) {
return -ERRNO_CODES.EINVAL;
}
var newStream;
newStream = FS.open(stream.path, stream.flags, 0, arg);
return newStream.fd;
}
case 1:
case 2:
return 0; // FD_CLOEXEC makes no sense for a single process.
case 3:
return stream.flags;
case 4: {
var arg = SYSCALLS.get();
stream.flags |= arg;
return 0;
}
case 12:
case 12: {
var arg = SYSCALLS.get();
var offset = 0;
// We're always unlocked.
HEAP16[(((arg)+(offset))>>1)]=2;
return 0;
}
case 13:
case 14:
case 13:
case 14:
return 0; // Pretend that the locking is successful.
case 16:
case 8:
return -ERRNO_CODES.EINVAL; // These are for sockets. We don't have them fully implemented yet.
case 9:
// musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves.
___setErrNo(ERRNO_CODES.EINVAL);
return -1;
default: {
return -ERRNO_CODES.EINVAL;
}
}
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall220(which, varargs) {SYSCALLS.varargs = varargs;
try {
// SYS_getdents64
var stream = SYSCALLS.getStreamFromFD(), dirp = SYSCALLS.get(), count = SYSCALLS.get();
if (!stream.getdents) {
stream.getdents = FS.readdir(stream.path);
}
var pos = 0;
while (stream.getdents.length > 0 && pos + 268 <= count) {
var id;
var type;
var name = stream.getdents.pop();
assert(name.length < 256); // limit of dirent struct
if (name[0] === '.') {
id = 1;
type = 4; // DT_DIR
} else {
var child = FS.lookupNode(stream.node, name);
id = child.id;
type = FS.isChrdev(child.mode) ? 2 : // DT_CHR, character device.
FS.isDir(child.mode) ? 4 : // DT_DIR, directory.
FS.isLink(child.mode) ? 10 : // DT_LNK, symbolic link.
8; // DT_REG, regular file.
}
HEAP32[((dirp + pos)>>2)]=id;
HEAP32[(((dirp + pos)+(4))>>2)]=stream.position;
HEAP16[(((dirp + pos)+(8))>>1)]=268;
HEAP8[(((dirp + pos)+(10))>>0)]=type;
for (var i = 0; i < name.length; i++) {
HEAP8[(((dirp + pos)+(11 + i))>>0)]=name.charCodeAt(i);
}
HEAP8[(((dirp + pos)+(11 + i))>>0)]=0;
pos += 268;
}
return pos;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _emscripten_glIsRenderbuffer(renderbuffer) {
var rb = GL.renderbuffers[renderbuffer];
if (!rb) return 0;
return GLctx.isRenderbuffer(rb);
}
function _glLinkProgram(program) {
GLctx.linkProgram(GL.programs[program]);
GL.programInfos[program] = null; // uniforms no longer keep the same names after linking
GL.populateUniformTable(program);
}
function _glBindTexture(target, texture) {
GLctx.bindTexture(target, texture ? GL.textures[texture] : null);
}
function _glUniform3iv(location, count, value) {
location = GL.uniforms[location];
count *= 3;
value = HEAP32.subarray((value)>>2,(value+count*4)>>2);
GLctx.uniform3iv(location, value);
}
function _emscripten_glShaderSource(shader, count, string, length) {
var source = GL.getSource(shader, count, string, length);
GLctx.shaderSource(GL.shaders[shader], source);
}
function _glEndQuery(x0) { GLctx['endQuery'](x0) }
function _pthread_mutex_init() {}
function _emscripten_glIsTexture(texture) {
var texture = GL.textures[texture];
if (!texture) return 0;
return GLctx.isTexture(texture);
}
function ___syscall54(which, varargs) {SYSCALLS.varargs = varargs;
try {
// ioctl
var stream = SYSCALLS.getStreamFromFD(), op = SYSCALLS.get();
switch (op) {
case 21505: {
if (!stream.tty) return -ERRNO_CODES.ENOTTY;
return 0;
}
case 21506: {
if (!stream.tty) return -ERRNO_CODES.ENOTTY;
return 0; // no-op, not actually adjusting terminal settings
}
case 21519: {
if (!stream.tty) return -ERRNO_CODES.ENOTTY;
var argp = SYSCALLS.get();
HEAP32[((argp)>>2)]=0;
return 0;
}
case 21520: {
if (!stream.tty) return -ERRNO_CODES.ENOTTY;
return -ERRNO_CODES.EINVAL; // not supported
}
case 21531: {
var argp = SYSCALLS.get();
return FS.ioctl(stream, op, argp);
}
default: abort('bad ioctl syscall ' + op);
}
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _glColorMask(red, green, blue, alpha) {
GLctx.colorMask(!!red, !!green, !!blue, !!alpha);
}
function _emscripten_glUniform4f(location, v0, v1, v2, v3) {
location = GL.uniforms[location];
GLctx.uniform4f(location, v0, v1, v2, v3);
}
function _glStencilOpSeparate(x0, x1, x2, x3) { GLctx['stencilOpSeparate'](x0, x1, x2, x3) }
function _emscripten_glHint(x0, x1) { GLctx['hint'](x0, x1) }
function _glDeleteQueries(n, ids) {
for (var i = 0; i < n; i++) {
var id = HEAP32[(((ids)+(i*4))>>2)];
var query = GL.queries[id];
if (!query) continue; // GL spec: "unused names in ids are ignored, as is the name zero."
GLctx['deleteQuery'](query);
GL.queries[id] = null;
}
}
function _glVertexAttrib4f(x0, x1, x2, x3, x4) { GLctx['vertexAttrib4f'](x0, x1, x2, x3, x4) }
function _emscripten_glUniform4i(location, v0, v1, v2, v3) {
location = GL.uniforms[location];
GLctx.uniform4i(location, v0, v1, v2, v3);
}
function _glGetTexParameteriv(target, pname, params) {
if (!params) {
// GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense
// if p == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
HEAP32[((params)>>2)]=GLctx.getTexParameter(target, pname);
}
function _emscripten_glViewport(x0, x1, x2, x3) { GLctx['viewport'](x0, x1, x2, x3) }
function _emscripten_memcpy_big(dest, src, num) {
HEAPU8.set(HEAPU8.subarray(src, src+num), dest);
return dest;
}
Module["_memcpy"] = _memcpy;
var _llvm_pow_f64=Math_pow;
function _glSamplerParameteri(sampler, pname, param) {
GLctx['samplerParameteri'](sampler ? GL.samplers[sampler] : null, pname, param);
}
function _pthread_mutexattr_init() {}
var _llvm_fabs_f32=Math_abs;
function _emscripten_glUniform3f(location, v0, v1, v2) {
location = GL.uniforms[location];
GLctx.uniform3f(location, v0, v1, v2);
}
function _emscripten_glBlendFunc(x0, x1) { GLctx['blendFunc'](x0, x1) }
function _emscripten_glUniform3i(location, v0, v1, v2) {
location = GL.uniforms[location];
GLctx.uniform3i(location, v0, v1, v2);
}
function _emscripten_glStencilOp(x0, x1, x2) { GLctx['stencilOp'](x0, x1, x2) }
function _glUniform1i(location, v0) {
location = GL.uniforms[location];
GLctx.uniform1i(location, v0);
}
function _glGetActiveAttrib(program, index, bufSize, length, size, type, name) {
program = GL.programs[program];
var info = GLctx.getActiveAttrib(program, index);
if (!info) return; // If an error occurs, nothing will be written to length, size and type and name.
if (bufSize > 0 && name) {
var numBytesWrittenExclNull = stringToUTF8(info.name, name, bufSize);
if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull;
} else {
if (length) HEAP32[((length)>>2)]=0;
}
if (size) HEAP32[((size)>>2)]=info.size;
if (type) HEAP32[((type)>>2)]=info.type;
}
function _glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels) {
var pixelData = null;
if (pixels) pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, 0);
GLctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixelData);
}
function emscriptenWebGLGetUniform(program, location, params, type) {
if (!params) {
// GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense
// if params == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
var data = GLctx.getUniform(GL.programs[program], GL.uniforms[location]);
if (typeof data == 'number' || typeof data == 'boolean') {
switch (type) {
case 'Integer': HEAP32[((params)>>2)]=data; break;
case 'Float': HEAPF32[((params)>>2)]=data; break;
default: throw 'internal emscriptenWebGLGetUniform() error, bad type: ' + type;
}
} else {
for (var i = 0; i < data.length; i++) {
switch (type) {
case 'Integer': HEAP32[(((params)+(i))>>2)]=data[i]; break;
case 'Float': HEAPF32[(((params)+(i))>>2)]=data[i]; break;
default: throw 'internal emscriptenWebGLGetUniform() error, bad type: ' + type;
}
}
}
}function _glGetUniformiv(program, location, params) {
emscriptenWebGLGetUniform(program, location, params, 'Integer');
}
function _emscripten_glEnableVertexAttribArray(index) {
GLctx.enableVertexAttribArray(index);
}
function _JS_SystemInfo_GetMemory()
{
return TOTAL_MEMORY/(1024*1024);
}
function _atexit(func, arg) {
__ATEXIT__.unshift({ func: func, arg: arg });
}
function _emscripten_glCopyTexSubImage2D(x0, x1, x2, x3, x4, x5, x6, x7) { GLctx['copyTexSubImage2D'](x0, x1, x2, x3, x4, x5, x6, x7) }
function _emscripten_set_touchcancel_callback(target, userData, useCapture, callbackfunc) {
JSEvents.registerTouchEventCallback(target, userData, useCapture, callbackfunc, 25, "touchcancel");
return 0;
}
function _glBindFramebuffer(target, framebuffer) {
GLctx.bindFramebuffer(target, framebuffer ? GL.framebuffers[framebuffer] : null);
}
function _emscripten_glBlendFuncSeparate(x0, x1, x2, x3) { GLctx['blendFuncSeparate'](x0, x1, x2, x3) }
function _glCullFace(x0) { GLctx['cullFace'](x0) }
function _emscripten_glColorPointer() {
Module['printErr']('missing function: emscripten_glColorPointer'); abort(-1);
}
function _glDeleteTextures(n, textures) {
for (var i = 0; i < n; i++) {
var id = HEAP32[(((textures)+(i*4))>>2)];
var texture = GL.textures[id];
if (!texture) continue; // GL spec: "glDeleteTextures silently ignores 0s and names that do not correspond to existing textures".
GLctx.deleteTexture(texture);
texture.name = 0;
GL.textures[id] = null;
}
}
function _emscripten_glNormalPointer() {
Module['printErr']('missing function: emscripten_glNormalPointer'); abort(-1);
}
function _emscripten_webgl_make_context_current(contextHandle) {
var success = GL.makeContextCurrent(contextHandle);
return success ? 0 : -5;
}
function _emscripten_glGetFramebufferAttachmentParameteriv(target, attachment, pname, params) {
var result = GLctx.getFramebufferAttachmentParameter(target, attachment, pname);
HEAP32[((params)>>2)]=result;
}
function _emscripten_get_pointerlock_status(pointerlockStatus) {
if (pointerlockStatus) JSEvents.fillPointerlockChangeEventData(pointerlockStatus);
if (!document.body.requestPointerLock && !document.body.mozRequestPointerLock && !document.body.webkitRequestPointerLock && !document.body.msRequestPointerLock) {
return -1;
}
return 0;
}
function _glAttachShader(program, shader) {
GLctx.attachShader(GL.programs[program],
GL.shaders[shader]);
}
function _emscripten_glGetVertexAttribfv(index, pname, params) {
// N.B. This function may only be called if the vertex attribute was specified using the function glVertexAttrib*f(),
// otherwise the results are undefined. (GLES3 spec 6.1.12)
emscriptenWebGLGetVertexAttrib(index, pname, params, 'Float');
}
function _emscripten_set_keyup_callback(target, userData, useCapture, callbackfunc) {
JSEvents.registerKeyEventCallback(target, userData, useCapture, callbackfunc, 3, "keyup");
return 0;
}
function _glDrawElements(mode, count, type, indices) {
GLctx.drawElements(mode, count, type, indices);
}
function _emscripten_get_fullscreen_status(fullscreenStatus) {
if (typeof JSEvents.fullscreenEnabled() === 'undefined') return -1;
JSEvents.fillFullscreenChangeEventData(fullscreenStatus);
return 0;
}
function _malloc(bytes) {
/* Over-allocate to make sure it is byte-aligned by 8.
* This will leak memory, but this is only the dummy
* implementation (replaced by dlmalloc normally) so
* not an issue.
*/
var ptr = Runtime.dynamicAlloc(bytes + 8);
return (ptr+8) & 0xFFFFFFF8;
}
Module["_malloc"] = _malloc;
function _free() {
}
Module["_free"] = _free;
function _getenv(name) {
// char *getenv(const char *name);
// http://pubs.opengroup.org/onlinepubs/009695399/functions/getenv.html
if (name === 0) return 0;
name = Pointer_stringify(name);
if (!ENV.hasOwnProperty(name)) return 0;
if (_getenv.ret) _free(_getenv.ret);
_getenv.ret = allocate(intArrayFromString(ENV[name]), 'i8', ALLOC_NORMAL);
return _getenv.ret;
}
function _putenv(string) {
// int putenv(char *string);
// http://pubs.opengroup.org/onlinepubs/009695399/functions/putenv.html
// WARNING: According to the standard (and the glibc implementation), the
// string is taken by reference so future changes are reflected.
// We copy it instead, possibly breaking some uses.
if (string === 0) {
___setErrNo(ERRNO_CODES.EINVAL);
return -1;
}
string = Pointer_stringify(string);
var splitPoint = string.indexOf('=')
if (string === '' || string.indexOf('=') === -1) {
___setErrNo(ERRNO_CODES.EINVAL);
return -1;
}
var name = string.slice(0, splitPoint);
var value = string.slice(splitPoint + 1);
if (!(name in ENV) || ENV[name] !== value) {
ENV[name] = value;
___buildEnvironment(ENV);
}
return 0;
}
function _SDL_RWFromConstMem(mem, size) {
var id = SDL.rwops.length; // TODO: recycle ids when they are null
SDL.rwops.push({ bytes: mem, count: size });
return id;
}function _TTF_FontHeight(font) {
var fontData = SDL.fonts[font];
return fontData.size;
}function _TTF_SizeText(font, text, w, h) {
var fontData = SDL.fonts[font];
if (w) {
HEAP32[((w)>>2)]=SDL.estimateTextWidth(fontData, Pointer_stringify(text));
}
if (h) {
HEAP32[((h)>>2)]=fontData.size;
}
return 0;
}function _TTF_RenderText_Solid(font, text, color) {
// XXX the font and color are ignored
text = Pointer_stringify(text) || ' '; // if given an empty string, still return a valid surface
var fontData = SDL.fonts[font];
var w = SDL.estimateTextWidth(fontData, text);
var h = fontData.size;
var color = SDL.loadColorToCSSRGB(color); // XXX alpha breaks fonts?
var fontString = h + 'px ' + fontData.name;
var surf = SDL.makeSurface(w, h, 0, false, 'text:' + text); // bogus numbers..
var surfData = SDL.surfaces[surf];
surfData.ctx.save();
surfData.ctx.fillStyle = color;
surfData.ctx.font = fontString;
surfData.ctx.textBaseline = 'top';
surfData.ctx.fillText(text, 0, 0);
surfData.ctx.restore();
return surf;
}function _Mix_HaltMusic() {
var audio = SDL.music.audio;
if (audio) {
audio.src = audio.src; // rewind <media> element
audio.currentPosition = 0; // rewind Web Audio graph playback.
audio.pause();
}
SDL.music.audio = null;
if (SDL.hookMusicFinished) {
Module['dynCall_v'](SDL.hookMusicFinished);
}
return 0;
}function _Mix_PlayMusic(id, loops) {
// Pause old music if it exists.
if (SDL.music.audio) {
if (!SDL.music.audio.paused) Module.printErr('Music is already playing. ' + SDL.music.source);
SDL.music.audio.pause();
}
var info = SDL.audios[id];
var audio;
if (info.webAudio) { // Play via Web Audio API
// Create an instance of the WebAudio object.
audio = {};
audio.resource = info; // This new webAudio object is an instance that refers to this existing resource.
audio.paused = false;
audio.currentPosition = 0;
audio.play = function() { SDL.playWebAudio(this); }
audio.pause = function() { SDL.pauseWebAudio(this); }
} else if (info.audio) { // Play via the <audio> element
audio = info.audio;
}
audio['onended'] = function() { if (SDL.music.audio == this) _Mix_HaltMusic(); } // will send callback
audio.loop = loops != 0; // TODO: handle N loops for finite N
audio.volume = SDL.music.volume;
SDL.music.audio = audio;
audio.play();
return 0;
}function _Mix_FreeChunk(id) {
SDL.audios[id] = null;
}function _Mix_LoadWAV_RW(rwopsID, freesrc) {
var rwops = SDL.rwops[rwopsID];
if (rwops === undefined)
return 0;
var filename = '';
var audio;
var webAudio;
var bytes;
if (rwops.filename !== undefined) {
filename = PATH.resolve(rwops.filename);
var raw = Module["preloadedAudios"][filename];
if (!raw) {
if (raw === null) Module.printErr('Trying to reuse preloaded audio, but freePreloadedMediaOnUse is set!');
if (!Module.noAudioDecoding) Runtime.warnOnce('Cannot find preloaded audio ' + filename);
// see if we can read the file-contents from the in-memory FS
try {
bytes = FS.readFile(filename);
} catch (e) {
Module.printErr('Couldn\'t find file for: ' + filename);
return 0;
}
}
if (Module['freePreloadedMediaOnUse']) {
Module["preloadedAudios"][filename] = null;
}
audio = raw;
}
else if (rwops.bytes !== undefined) {
// For Web Audio context buffer decoding, we must make a clone of the audio data, but for <media> element,
// a view to existing data is sufficient.
if (SDL.webAudioAvailable()) bytes = HEAPU8.buffer.slice(rwops.bytes, rwops.bytes + rwops.count);
else bytes = HEAPU8.subarray(rwops.bytes, rwops.bytes + rwops.count);
}
else {
return 0;
}
var arrayBuffer = bytes ? bytes.buffer || bytes : bytes;
// To allow user code to work around browser bugs with audio playback on <audio> elements an Web Audio, enable
// the user code to hook in a callback to decide on a file basis whether each file should use Web Audio or <audio> for decoding and playback.
// In particular, see https://bugzilla.mozilla.org/show_bug.cgi?id=654787 and ?id=1012801 for tradeoffs.
var canPlayWithWebAudio = Module['SDL_canPlayWithWebAudio'] === undefined || Module['SDL_canPlayWithWebAudio'](filename, arrayBuffer);
if (bytes !== undefined && SDL.webAudioAvailable() && canPlayWithWebAudio) {
audio = undefined;
webAudio = {};
// The audio decoding process is asynchronous, which gives trouble if user code plays the audio data back immediately
// after loading. Therefore prepare an array of callback handlers to run when this audio decoding is complete, which
// will then start the playback (with some delay).
webAudio.onDecodeComplete = []; // While this member array exists, decoding hasn't finished yet.
function onDecodeComplete(data) {
webAudio.decodedBuffer = data;
// Call all handlers that were waiting for this decode to finish, and clear the handler list.
webAudio.onDecodeComplete.forEach(function(e) { e(); });
webAudio.onDecodeComplete = undefined; // Don't allow more callback handlers since audio has finished decoding.
}
SDL.audioContext['decodeAudioData'](arrayBuffer, onDecodeComplete);
} else if (audio === undefined && bytes) {
// Here, we didn't find a preloaded audio but we either were passed a filepath for
// which we loaded bytes, or we were passed some bytes
var blob = new Blob([bytes], {type: rwops.mimetype});
var url = URL.createObjectURL(blob);
audio = new Audio();
audio.src = url;
audio.mozAudioChannelType = 'content'; // bugzilla 910340
}
var id = SDL.audios.length;
// Keep the loaded audio in the audio arrays, ready for playback
SDL.audios.push({
source: filename,
audio: audio, // Points to the <audio> element, if loaded
webAudio: webAudio // Points to a Web Audio -specific resource object, if loaded
});
return id;
}function _Mix_PlayChannel(channel, id, loops) {
// TODO: handle fixed amount of N loops. Currently loops either 0 or infinite times.
// Get the audio element associated with the ID
var info = SDL.audios[id];
if (!info) return -1;
if (!info.audio && !info.webAudio) return -1;
// If the user asks us to allocate a channel automatically, get the first
// free one.
if (channel == -1) {
for (var i = SDL.channelMinimumNumber; i < SDL.numChannels; i++) {
if (!SDL.channels[i].audio) {
channel = i;
break;
}
}
if (channel == -1) {
Module.printErr('All ' + SDL.numChannels + ' channels in use!');
return -1;
}
}
var channelInfo = SDL.channels[channel];
var audio;
if (info.webAudio) {
// Create an instance of the WebAudio object.
audio = {};
audio.resource = info; // This new object is an instance that refers to this existing resource.
audio.paused = false;
audio.currentPosition = 0;
// Make our instance look similar to the instance of a <media> to make api simple.
audio.play = function() { SDL.playWebAudio(this); }
audio.pause = function() { SDL.pauseWebAudio(this); }
} else {
// We clone the audio node to utilize the preloaded audio buffer, since
// the browser has already preloaded the audio file.
audio = info.audio.cloneNode(true);
audio.numChannels = info.audio.numChannels;
audio.frequency = info.audio.frequency;
}
audio['onended'] = function SDL_audio_onended() { // TODO: cache these
if (channelInfo.audio == this) { channelInfo.audio.paused = true; channelInfo.audio = null; }
if (SDL.channelFinished) Runtime.getFuncWrapper(SDL.channelFinished, 'vi')(channel);
}
channelInfo.audio = audio;
// TODO: handle N loops. Behavior matches Mix_PlayMusic
audio.loop = loops != 0;
audio.volume = channelInfo.volume;
audio.play();
return channel;
}function _SDL_PauseAudio(pauseOn) {
if (!SDL.audio) {
return;
}
if (pauseOn) {
if (SDL.audio.timer !== undefined) {
clearTimeout(SDL.audio.timer);
SDL.audio.numAudioTimersPending = 0;
SDL.audio.timer = undefined;
}
} else if (!SDL.audio.timer) {
// Start the audio playback timer callback loop.
SDL.audio.numAudioTimersPending = 1;
SDL.audio.timer = Browser.safeSetTimeout(SDL.audio.caller, 1);
}
SDL.audio.paused = pauseOn;
}function _SDL_CloseAudio() {
if (SDL.audio) {
_SDL_PauseAudio(1);
_free(SDL.audio.buffer);
SDL.audio = null;
SDL.allocateChannels(0);
}
}function _SDL_LockSurface(surf) {
var surfData = SDL.surfaces[surf];
surfData.locked++;
if (surfData.locked > 1) return 0;
if (!surfData.buffer) {
surfData.buffer = _malloc(surfData.width * surfData.height * 4);
HEAP32[(((surf)+(20))>>2)]=surfData.buffer;
}
// Mark in C/C++-accessible SDL structure
// SDL_Surface has the following fields: Uint32 flags, SDL_PixelFormat *format; int w, h; Uint16 pitch; void *pixels; ...
// So we have fields all of the same size, and 5 of them before us.
// TODO: Use macros like in library.js
HEAP32[(((surf)+(20))>>2)]=surfData.buffer;
if (surf == SDL.screen && Module.screenIsReadOnly && surfData.image) return 0;
if (SDL.defaults.discardOnLock) {
if (!surfData.image) {
surfData.image = surfData.ctx.createImageData(surfData.width, surfData.height);
}
if (!SDL.defaults.opaqueFrontBuffer) return;
} else {
surfData.image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height);
}
// Emulate desktop behavior and kill alpha values on the locked surface. (very costly!) Set SDL.defaults.opaqueFrontBuffer = false
// if you don't want this.
if (surf == SDL.screen && SDL.defaults.opaqueFrontBuffer) {
var data = surfData.image.data;
var num = data.length;
for (var i = 0; i < num/4; i++) {
data[i*4+3] = 255; // opacity, as canvases blend alpha
}
}
if (SDL.defaults.copyOnLock && !SDL.defaults.discardOnLock) {
// Copy pixel data to somewhere accessible to 'C/C++'
if (surfData.isFlagSet(0x00200000 /* SDL_HWPALETTE */)) {
// If this is neaded then
// we should compact the data from 32bpp to 8bpp index.
// I think best way to implement this is use
// additional colorMap hash (color->index).
// Something like this:
//
// var size = surfData.width * surfData.height;
// var data = '';
// for (var i = 0; i<size; i++) {
// var color = SDL.translateRGBAToColor(
// surfData.image.data[i*4 ],
// surfData.image.data[i*4 +1],
// surfData.image.data[i*4 +2],
// 255);
// var index = surfData.colorMap[color];
// HEAP8[(((surfData.buffer)+(i))>>0)]=index;
// }
throw 'CopyOnLock is not supported for SDL_LockSurface with SDL_HWPALETTE flag set' + new Error().stack;
} else {
HEAPU8.set(surfData.image.data, surfData.buffer);
}
}
return 0;
}
function _SDL_FreeRW(rwopsID) {
SDL.rwops[rwopsID] = null;
while (SDL.rwops.length > 0 && SDL.rwops[SDL.rwops.length-1] === null) {
SDL.rwops.pop();
}
}function _IMG_Load_RW(rwopsID, freeSrc) {
try {
// stb_image integration support
function cleanup() {
if (rwops && freeSrc) _SDL_FreeRW(rwopsID);
};
function addCleanup(func) {
var old = cleanup;
cleanup = function added_cleanup() {
old();
func();
}
}
function callStbImage(func, params) {
var x = Module['_malloc'](4);
var y = Module['_malloc'](4);
var comp = Module['_malloc'](4);
addCleanup(function() {
Module['_free'](x);
Module['_free'](y);
Module['_free'](comp);
if (data) Module['_stbi_image_free'](data);
});
var data = Module['_' + func].apply(null, params.concat([x, y, comp, 0]));
if (!data) return null;
return {
rawData: true,
data: data,
width: HEAP32[((x)>>2)],
height: HEAP32[((y)>>2)],
size: HEAP32[((x)>>2)] * HEAP32[((y)>>2)] * HEAP32[((comp)>>2)],
bpp: HEAP32[((comp)>>2)]
};
}
var rwops = SDL.rwops[rwopsID];
if (rwops === undefined) {
return 0;
}
var filename = rwops.filename;
if (filename === undefined) {
Runtime.warnOnce('Only file names that have been preloaded are supported for IMG_Load_RW. Consider using STB_IMAGE=1 if you want synchronous image decoding (see settings.js), or package files with --use-preload-plugins');
return 0;
}
if (!raw) {
filename = PATH.resolve(filename);
var raw = Module["preloadedImages"][filename];
if (!raw) {
if (raw === null) Module.printErr('Trying to reuse preloaded image, but freePreloadedMediaOnUse is set!');
Runtime.warnOnce('Cannot find preloaded image ' + filename);
Runtime.warnOnce('Cannot find preloaded image ' + filename + '. Consider using STB_IMAGE=1 if you want synchronous image decoding (see settings.js), or package files with --use-preload-plugins');
return 0;
} else if (Module['freePreloadedMediaOnUse']) {
Module["preloadedImages"][filename] = null;
}
}
var surf = SDL.makeSurface(raw.width, raw.height, 0, false, 'load:' + filename);
var surfData = SDL.surfaces[surf];
surfData.ctx.globalCompositeOperation = "copy";
if (!raw.rawData) {
surfData.ctx.drawImage(raw, 0, 0, raw.width, raw.height, 0, 0, raw.width, raw.height);
} else {
var imageData = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height);
if (raw.bpp == 4) {
// rgba
imageData.data.set(HEAPU8.subarray((raw.data),(raw.data+raw.size)));
} else if (raw.bpp == 3) {
// rgb
var pixels = raw.size/3;
var data = imageData.data;
var sourcePtr = raw.data;
var destPtr = 0;
for (var i = 0; i < pixels; i++) {
data[destPtr++] = HEAPU8[((sourcePtr++)>>0)];
data[destPtr++] = HEAPU8[((sourcePtr++)>>0)];
data[destPtr++] = HEAPU8[((sourcePtr++)>>0)];
data[destPtr++] = 255;
}
} else if (raw.bpp == 1) {
// grayscale
var pixels = raw.size;
var data = imageData.data;
var sourcePtr = raw.data;
var destPtr = 0;
for (var i = 0; i < pixels; i++) {
var value = HEAPU8[((sourcePtr++)>>0)];
data[destPtr++] = value;
data[destPtr++] = value;
data[destPtr++] = value;
data[destPtr++] = 255;
}
} else {
Module.printErr('cannot handle bpp ' + raw.bpp);
return 0;
}
surfData.ctx.putImageData(imageData, 0, 0);
}
surfData.ctx.globalCompositeOperation = "source-over";
// XXX SDL does not specify that loaded images must have available pixel data, in fact
// there are cases where you just want to blit them, so you just need the hardware
// accelerated version. However, code everywhere seems to assume that the pixels
// are in fact available, so we retrieve it here. This does add overhead though.
_SDL_LockSurface(surf);
surfData.locked--; // The surface is not actually locked in this hack
if (SDL.GL) {
// After getting the pixel data, we can free the canvas and context if we do not need to do 2D canvas blitting
surfData.canvas = surfData.ctx = null;
}
return surf;
} finally {
cleanup();
}
}
function _SDL_RWFromFile(_name, mode) {
var id = SDL.rwops.length; // TODO: recycle ids when they are null
var name = Pointer_stringify(_name)
SDL.rwops.push({ filename: name, mimetype: Browser.getMimetype(name) });
return id;
}function _IMG_Load(filename){
var rwops = _SDL_RWFromFile(filename);
var result = _IMG_Load_RW(rwops, 1);
return result;
}function _SDL_UpperBlitScaled(src, srcrect, dst, dstrect) {
return SDL.blitSurface(src, srcrect, dst, dstrect, true);
}function _SDL_UpperBlit(src, srcrect, dst, dstrect) {
return SDL.blitSurface(src, srcrect, dst, dstrect, false);
}function _SDL_GetTicks() {
return (Date.now() - SDL.startTime)|0;
}var SDL={defaults:{width:320,height:200,copyOnLock:true,discardOnLock:false,opaqueFrontBuffer:true},version:null,surfaces:{},canvasPool:[],events:[],fonts:[null],audios:[null],rwops:[null],music:{audio:null,volume:1},mixerFrequency:22050,mixerFormat:32784,mixerNumChannels:2,mixerChunkSize:1024,channelMinimumNumber:0,GL:false,glAttributes:{0:3,1:3,2:2,3:0,4:0,5:1,6:16,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0,15:1,16:0,17:0,18:0},keyboardState:null,keyboardMap:{},canRequestFullscreen:false,isRequestingFullscreen:false,textInput:false,startTime:null,initFlags:0,buttonState:0,modState:0,DOMButtons:[0,0,0],DOMEventToSDLEvent:{},TOUCH_DEFAULT_ID:0,eventHandler:null,eventHandlerContext:null,eventHandlerTemp:0,keyCodes:{16:1249,17:1248,18:1250,20:1081,33:1099,34:1102,35:1101,36:1098,37:1104,38:1106,39:1103,40:1105,44:316,45:1097,46:127,91:1251,93:1125,96:1122,97:1113,98:1114,99:1115,100:1116,101:1117,102:1118,103:1119,104:1120,105:1121,106:1109,107:1111,109:1110,110:1123,111:1108,112:1082,113:1083,114:1084,115:1085,116:1086,117:1087,118:1088,119:1089,120:1090,121:1091,122:1092,123:1093,124:1128,125:1129,126:1130,127:1131,128:1132,129:1133,130:1134,131:1135,132:1136,133:1137,134:1138,135:1139,144:1107,160:94,161:33,162:34,163:35,164:36,165:37,166:38,167:95,168:40,169:41,170:42,171:43,172:124,173:45,174:123,175:125,176:126,181:127,182:129,183:128,188:44,190:46,191:47,192:96,219:91,220:92,221:93,222:39,224:1251},scanCodes:{8:42,9:43,13:40,27:41,32:44,35:204,39:53,44:54,46:55,47:56,48:39,49:30,50:31,51:32,52:33,53:34,54:35,55:36,56:37,57:38,58:203,59:51,61:46,91:47,92:49,93:48,96:52,97:4,98:5,99:6,100:7,101:8,102:9,103:10,104:11,105:12,106:13,107:14,108:15,109:16,110:17,111:18,112:19,113:20,114:21,115:22,116:23,117:24,118:25,119:26,120:27,121:28,122:29,127:76,305:224,308:226,316:70},loadRect:function (rect) {
return {
x: HEAP32[((rect + 0)>>2)],
y: HEAP32[((rect + 4)>>2)],
w: HEAP32[((rect + 8)>>2)],
h: HEAP32[((rect + 12)>>2)]
};
},updateRect:function (rect, r) {
HEAP32[((rect)>>2)]=r.x;
HEAP32[(((rect)+(4))>>2)]=r.y;
HEAP32[(((rect)+(8))>>2)]=r.w;
HEAP32[(((rect)+(12))>>2)]=r.h;
},intersectionOfRects:function (first, second) {
var leftX = Math.max(first.x, second.x);
var leftY = Math.max(first.y, second.y);
var rightX = Math.min(first.x + first.w, second.x + second.w);
var rightY = Math.min(first.y + first.h, second.y + second.h);
return {
x: leftX,
y: leftY,
w: Math.max(leftX, rightX) - leftX,
h: Math.max(leftY, rightY) - leftY
}
},checkPixelFormat:function (fmt) {
},loadColorToCSSRGB:function (color) {
var rgba = HEAP32[((color)>>2)];
return 'rgb(' + (rgba&255) + ',' + ((rgba >> 8)&255) + ',' + ((rgba >> 16)&255) + ')';
},loadColorToCSSRGBA:function (color) {
var rgba = HEAP32[((color)>>2)];
return 'rgba(' + (rgba&255) + ',' + ((rgba >> 8)&255) + ',' + ((rgba >> 16)&255) + ',' + (((rgba >> 24)&255)/255) + ')';
},translateColorToCSSRGBA:function (rgba) {
return 'rgba(' + (rgba&0xff) + ',' + (rgba>>8 & 0xff) + ',' + (rgba>>16 & 0xff) + ',' + (rgba>>>24)/0xff + ')';
},translateRGBAToCSSRGBA:function (r, g, b, a) {
return 'rgba(' + (r&0xff) + ',' + (g&0xff) + ',' + (b&0xff) + ',' + (a&0xff)/255 + ')';
},translateRGBAToColor:function (r, g, b, a) {
return r | g << 8 | b << 16 | a << 24;
},makeSurface:function (width, height, flags, usePageCanvas, source, rmask, gmask, bmask, amask) {
flags = flags || 0;
var is_SDL_HWSURFACE = flags & 0x00000001;
var is_SDL_HWPALETTE = flags & 0x00200000;
var is_SDL_OPENGL = flags & 0x04000000;
var surf = _malloc(60);
var pixelFormat = _malloc(44);
//surface with SDL_HWPALETTE flag is 8bpp surface (1 byte)
var bpp = is_SDL_HWPALETTE ? 1 : 4;
var buffer = 0;
// preemptively initialize this for software surfaces,
// otherwise it will be lazily initialized inside of SDL_LockSurface
if (!is_SDL_HWSURFACE && !is_SDL_OPENGL) {
buffer = _malloc(width * height * 4);
}
HEAP32[((surf)>>2)]=flags;
HEAP32[(((surf)+(4))>>2)]=pixelFormat;
HEAP32[(((surf)+(8))>>2)]=width;
HEAP32[(((surf)+(12))>>2)]=height;
HEAP32[(((surf)+(16))>>2)]=width * bpp; // assuming RGBA or indexed for now,
// since that is what ImageData gives us in browsers
HEAP32[(((surf)+(20))>>2)]=buffer;
HEAP32[(((surf)+(36))>>2)]=0;
HEAP32[(((surf)+(40))>>2)]=0;
HEAP32[(((surf)+(44))>>2)]=Module["canvas"].width;
HEAP32[(((surf)+(48))>>2)]=Module["canvas"].height;
HEAP32[(((surf)+(56))>>2)]=1;
HEAP32[((pixelFormat)>>2)]=-2042224636;
HEAP32[(((pixelFormat)+(4))>>2)]=0;// TODO
HEAP8[(((pixelFormat)+(8))>>0)]=bpp * 8;
HEAP8[(((pixelFormat)+(9))>>0)]=bpp;
HEAP32[(((pixelFormat)+(12))>>2)]=rmask || 0x000000ff;
HEAP32[(((pixelFormat)+(16))>>2)]=gmask || 0x0000ff00;
HEAP32[(((pixelFormat)+(20))>>2)]=bmask || 0x00ff0000;
HEAP32[(((pixelFormat)+(24))>>2)]=amask || 0xff000000;
// Decide if we want to use WebGL or not
SDL.GL = SDL.GL || is_SDL_OPENGL;
var canvas;
if (!usePageCanvas) {
if (SDL.canvasPool.length > 0) {
canvas = SDL.canvasPool.pop();
} else {
canvas = document.createElement('canvas');
}
canvas.width = width;
canvas.height = height;
} else {
canvas = Module['canvas'];
}
var webGLContextAttributes = {
antialias: ((SDL.glAttributes[13 /*SDL_GL_MULTISAMPLEBUFFERS*/] != 0) && (SDL.glAttributes[14 /*SDL_GL_MULTISAMPLESAMPLES*/] > 1)),
depth: (SDL.glAttributes[6 /*SDL_GL_DEPTH_SIZE*/] > 0),
stencil: (SDL.glAttributes[7 /*SDL_GL_STENCIL_SIZE*/] > 0),
alpha: (SDL.glAttributes[3 /*SDL_GL_ALPHA_SIZE*/] > 0)
};
var ctx = Browser.createContext(canvas, is_SDL_OPENGL, usePageCanvas, webGLContextAttributes);
SDL.surfaces[surf] = {
width: width,
height: height,
canvas: canvas,
ctx: ctx,
surf: surf,
buffer: buffer,
pixelFormat: pixelFormat,
alpha: 255,
flags: flags,
locked: 0,
usePageCanvas: usePageCanvas,
source: source,
isFlagSet: function(flag) {
return flags & flag;
}
};
return surf;
},copyIndexedColorData:function (surfData, rX, rY, rW, rH) {
// HWPALETTE works with palette
// setted by SDL_SetColors
if (!surfData.colors) {
return;
}
var fullWidth = Module['canvas'].width;
var fullHeight = Module['canvas'].height;
var startX = rX || 0;
var startY = rY || 0;
var endX = (rW || (fullWidth - startX)) + startX;
var endY = (rH || (fullHeight - startY)) + startY;
var buffer = surfData.buffer;
if (!surfData.image.data32) {
surfData.image.data32 = new Uint32Array(surfData.image.data.buffer);
}
var data32 = surfData.image.data32;
var colors32 = surfData.colors32;
for (var y = startY; y < endY; ++y) {
var base = y * fullWidth;
for (var x = startX; x < endX; ++x) {
data32[base + x] = colors32[HEAPU8[((buffer + base + x)>>0)]];
}
}
},freeSurface:function (surf) {
var refcountPointer = surf + 56;
var refcount = HEAP32[((refcountPointer)>>2)];
if (refcount > 1) {
HEAP32[((refcountPointer)>>2)]=refcount - 1;
return;
}
var info = SDL.surfaces[surf];
if (!info.usePageCanvas && info.canvas) SDL.canvasPool.push(info.canvas);
if (info.buffer) _free(info.buffer);
_free(info.pixelFormat);
_free(surf);
SDL.surfaces[surf] = null;
if (surf === SDL.screen) {
SDL.screen = null;
}
},blitSurface__deps:["SDL_LockSurface"],blitSurface:function (src, srcrect, dst, dstrect, scale) {
var srcData = SDL.surfaces[src];
var dstData = SDL.surfaces[dst];
var sr, dr;
if (srcrect) {
sr = SDL.loadRect(srcrect);
} else {
sr = { x: 0, y: 0, w: srcData.width, h: srcData.height };
}
if (dstrect) {
dr = SDL.loadRect(dstrect);
} else {
dr = { x: 0, y: 0, w: srcData.width, h: srcData.height };
}
if (dstData.clipRect) {
var widthScale = (!scale || sr.w === 0) ? 1 : sr.w / dr.w;
var heightScale = (!scale || sr.h === 0) ? 1 : sr.h / dr.h;
dr = SDL.intersectionOfRects(dstData.clipRect, dr);
sr.w = dr.w * widthScale;
sr.h = dr.h * heightScale;
if (dstrect) {
SDL.updateRect(dstrect, dr);
}
}
var blitw, blith;
if (scale) {
blitw = dr.w; blith = dr.h;
} else {
blitw = sr.w; blith = sr.h;
}
if (sr.w === 0 || sr.h === 0 || blitw === 0 || blith === 0) {
return 0;
}
var oldAlpha = dstData.ctx.globalAlpha;
dstData.ctx.globalAlpha = srcData.alpha/255;
dstData.ctx.drawImage(srcData.canvas, sr.x, sr.y, sr.w, sr.h, dr.x, dr.y, blitw, blith);
dstData.ctx.globalAlpha = oldAlpha;
if (dst != SDL.screen) {
// XXX As in IMG_Load, for compatibility we write out |pixels|
Runtime.warnOnce('WARNING: copying canvas data to memory for compatibility');
_SDL_LockSurface(dst);
dstData.locked--; // The surface is not actually locked in this hack
}
return 0;
},downFingers:{},savedKeydown:null,receiveEvent:function (event) {
function unpressAllPressedKeys() {
// Un-press all pressed keys: TODO
for (var code in SDL.keyboardMap) {
SDL.events.push({
type: 'keyup',
keyCode: SDL.keyboardMap[code]
});
}
};
switch(event.type) {
case 'touchstart': case 'touchmove': {
event.preventDefault();
var touches = [];
// Clear out any touchstart events that we've already processed
if (event.type === 'touchstart') {
for (var i = 0; i < event.touches.length; i++) {
var touch = event.touches[i];
if (SDL.downFingers[touch.identifier] != true) {
SDL.downFingers[touch.identifier] = true;
touches.push(touch);
}
}
} else {
touches = event.touches;
}
var firstTouch = touches[0];
if (event.type == 'touchstart') {
SDL.DOMButtons[0] = 1;
}
var mouseEventType;
switch(event.type) {
case 'touchstart': mouseEventType = 'mousedown'; break;
case 'touchmove': mouseEventType = 'mousemove'; break;
}
var mouseEvent = {
type: mouseEventType,
button: 0,
pageX: firstTouch.clientX,
pageY: firstTouch.clientY
};
SDL.events.push(mouseEvent);
for (var i = 0; i < touches.length; i++) {
var touch = touches[i];
SDL.events.push({
type: event.type,
touch: touch
});
};
break;
}
case 'touchend': {
event.preventDefault();
// Remove the entry in the SDL.downFingers hash
// because the finger is no longer down.
for(var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
if (SDL.downFingers[touch.identifier] === true) {
delete SDL.downFingers[touch.identifier];
}
}
var mouseEvent = {
type: 'mouseup',
button: 0,
pageX: event.changedTouches[0].clientX,
pageY: event.changedTouches[0].clientY
};
SDL.DOMButtons[0] = 0;
SDL.events.push(mouseEvent);
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
SDL.events.push({
type: 'touchend',
touch: touch
});
};
break;
}
case 'DOMMouseScroll': case 'mousewheel': case 'wheel':
var delta = -Browser.getMouseWheelDelta(event); // Flip the wheel direction to translate from browser wheel direction (+:down) to SDL direction (+:up)
delta = (delta == 0) ? 0 : (delta > 0 ? Math.max(delta, 1) : Math.min(delta, -1)); // Quantize to integer so that minimum scroll is at least +/- 1.
// Simulate old-style SDL events representing mouse wheel input as buttons
var button = delta > 0 ? 3 /*SDL_BUTTON_WHEELUP-1*/ : 4 /*SDL_BUTTON_WHEELDOWN-1*/; // Subtract one since JS->C marshalling is defined to add one back.
SDL.events.push({ type: 'mousedown', button: button, pageX: event.pageX, pageY: event.pageY });
SDL.events.push({ type: 'mouseup', button: button, pageX: event.pageX, pageY: event.pageY });
// Pass a delta motion event.
SDL.events.push({ type: 'wheel', deltaX: 0, deltaY: delta });
event.preventDefault(); // If we don't prevent this, then 'wheel' event will be sent again by the browser as 'DOMMouseScroll' and we will receive this same event the second time.
break;
case 'mousemove':
if (SDL.DOMButtons[0] === 1) {
SDL.events.push({
type: 'touchmove',
touch: {
identifier: 0,
deviceID: -1,
pageX: event.pageX,
pageY: event.pageY
}
});
}
if (Browser.pointerLock) {
// workaround for firefox bug 750111
if ('mozMovementX' in event) {
event['movementX'] = event['mozMovementX'];
event['movementY'] = event['mozMovementY'];
}
// workaround for Firefox bug 782777
if (event['movementX'] == 0 && event['movementY'] == 0) {
// ignore a mousemove event if it doesn't contain any movement info
// (without pointer lock, we infer movement from pageX/pageY, so this check is unnecessary)
event.preventDefault();
return;
}
}
// fall through
case 'keydown': case 'keyup': case 'keypress': case 'mousedown': case 'mouseup':
// If we preventDefault on keydown events, the subsequent keypress events
// won't fire. However, it's fine (and in some cases necessary) to
// preventDefault for keys that don't generate a character. Otherwise,
// preventDefault is the right thing to do in general.
if (event.type !== 'keydown' || (!SDL.unicode && !SDL.textInput) || (event.keyCode === 8 /* backspace */ || event.keyCode === 9 /* tab */)) {
event.preventDefault();
}
if (event.type == 'mousedown') {
SDL.DOMButtons[event.button] = 1;
SDL.events.push({
type: 'touchstart',
touch: {
identifier: 0,
deviceID: -1,
pageX: event.pageX,
pageY: event.pageY
}
});
} else if (event.type == 'mouseup') {
// ignore extra ups, can happen if we leave the canvas while pressing down, then return,
// since we add a mouseup in that case
if (!SDL.DOMButtons[event.button]) {
return;
}
SDL.events.push({
type: 'touchend',
touch: {
identifier: 0,
deviceID: -1,
pageX: event.pageX,
pageY: event.pageY
}
});
SDL.DOMButtons[event.button] = 0;
}
// We can only request fullscreen as the result of user input.
// Due to this limitation, we toggle a boolean on keydown which
// SDL_WM_ToggleFullScreen will check and subsequently set another
// flag indicating for us to request fullscreen on the following
// keyup. This isn't perfect, but it enables SDL_WM_ToggleFullScreen
// to work as the result of a keypress (which is an extremely
// common use case).
if (event.type === 'keydown' || event.type === 'mousedown') {
SDL.canRequestFullscreen = true;
} else if (event.type === 'keyup' || event.type === 'mouseup') {
if (SDL.isRequestingFullscreen) {
Module['requestFullscreen'](/*lockPointer=*/true, /*resizeCanvas=*/true);
SDL.isRequestingFullscreen = false;
}
SDL.canRequestFullscreen = false;
}
// SDL expects a unicode character to be passed to its keydown events.
// Unfortunately, the browser APIs only provide a charCode property on
// keypress events, so we must backfill in keydown events with their
// subsequent keypress event's charCode.
if (event.type === 'keypress' && SDL.savedKeydown) {
// charCode is read-only
SDL.savedKeydown.keypressCharCode = event.charCode;
SDL.savedKeydown = null;
} else if (event.type === 'keydown') {
SDL.savedKeydown = event;
}
// Don't push keypress events unless SDL_StartTextInput has been called.
if (event.type !== 'keypress' || SDL.textInput) {
SDL.events.push(event);
}
break;
case 'mouseout':
// Un-press all pressed mouse buttons, because we might miss the release outside of the canvas
for (var i = 0; i < 3; i++) {
if (SDL.DOMButtons[i]) {
SDL.events.push({
type: 'mouseup',
button: i,
pageX: event.pageX,
pageY: event.pageY
});
SDL.DOMButtons[i] = 0;
}
}
event.preventDefault();
break;
case 'focus':
SDL.events.push(event);
event.preventDefault();
break;
case 'blur':
SDL.events.push(event);
unpressAllPressedKeys();
event.preventDefault();
break;
case 'visibilitychange':
SDL.events.push({
type: 'visibilitychange',
visible: !document.hidden
});
unpressAllPressedKeys();
event.preventDefault();
break;
case 'unload':
if (Browser.mainLoop.runner) {
SDL.events.push(event);
// Force-run a main event loop, since otherwise this event will never be caught!
Browser.mainLoop.runner();
}
return;
case 'resize':
SDL.events.push(event);
// manually triggered resize event doesn't have a preventDefault member
if (event.preventDefault) {
event.preventDefault();
}
break;
}
if (SDL.events.length >= 10000) {
Module.printErr('SDL event queue full, dropping events');
SDL.events = SDL.events.slice(0, 10000);
}
// If we have a handler installed, this will push the events to the app
// instead of the app polling for them.
SDL.flushEventsToHandler();
return;
},lookupKeyCodeForEvent:function (event) {
var code = event.keyCode;
if (code >= 65 && code <= 90) {
code += 32; // make lowercase for SDL
} else {
code = SDL.keyCodes[event.keyCode] || event.keyCode;
// If this is one of the modifier keys (224 | 1<<10 - 227 | 1<<10), and the event specifies that it is
// a right key, add 4 to get the right key SDL key code.
if (event.location === KeyboardEvent.DOM_KEY_LOCATION_RIGHT && code >= (224 | 1<<10) && code <= (227 | 1<<10)) {
code += 4;
}
}
return code;
},handleEvent:function (event) {
if (event.handled) return;
event.handled = true;
switch (event.type) {
case 'touchstart': case 'touchend': case 'touchmove': {
Browser.calculateMouseEvent(event);
break;
}
case 'keydown': case 'keyup': {
var down = event.type === 'keydown';
var code = SDL.lookupKeyCodeForEvent(event);
HEAP8[(((SDL.keyboardState)+(code))>>0)]=down;
// TODO: lmeta, rmeta, numlock, capslock, KMOD_MODE, KMOD_RESERVED
SDL.modState = (HEAP8[(((SDL.keyboardState)+(1248))>>0)] ? 0x0040 : 0) | // KMOD_LCTRL
(HEAP8[(((SDL.keyboardState)+(1249))>>0)] ? 0x0001 : 0) | // KMOD_LSHIFT
(HEAP8[(((SDL.keyboardState)+(1250))>>0)] ? 0x0100 : 0) | // KMOD_LALT
(HEAP8[(((SDL.keyboardState)+(1252))>>0)] ? 0x0080 : 0) | // KMOD_RCTRL
(HEAP8[(((SDL.keyboardState)+(1253))>>0)] ? 0x0002 : 0) | // KMOD_RSHIFT
(HEAP8[(((SDL.keyboardState)+(1254))>>0)] ? 0x0200 : 0); // KMOD_RALT
if (down) {
SDL.keyboardMap[code] = event.keyCode; // save the DOM input, which we can use to unpress it during blur
} else {
delete SDL.keyboardMap[code];
}
break;
}
case 'mousedown': case 'mouseup':
if (event.type == 'mousedown') {
// SDL_BUTTON(x) is defined as (1 << ((x)-1)). SDL buttons are 1-3,
// and DOM buttons are 0-2, so this means that the below formula is
// correct.
SDL.buttonState |= 1 << event.button;
} else if (event.type == 'mouseup') {
SDL.buttonState &= ~(1 << event.button);
}
// fall through
case 'mousemove': {
Browser.calculateMouseEvent(event);
break;
}
}
},flushEventsToHandler:function () {
if (!SDL.eventHandler) return;
while (SDL.pollEvent(SDL.eventHandlerTemp)) {
Module['dynCall_iii'](SDL.eventHandler, SDL.eventHandlerContext, SDL.eventHandlerTemp);
}
},pollEvent:function (ptr) {
if (SDL.initFlags & 0x200 && SDL.joystickEventState) {
// If SDL_INIT_JOYSTICK was supplied AND the joystick system is configured
// to automatically query for events, query for joystick events.
SDL.queryJoysticks();
}
if (ptr) {
while (SDL.events.length > 0) {
if (SDL.makeCEvent(SDL.events.shift(), ptr) !== false) return 1;
}
return 0;
} else {
// XXX: somewhat risky in that we do not check if the event is real or not (makeCEvent returns false) if no pointer supplied
return SDL.events.length > 0;
}
},makeCEvent:function (event, ptr) {
if (typeof event === 'number') {
// This is a pointer to a copy of a native C event that was SDL_PushEvent'ed
_memcpy(ptr, event, 28);
_free(event); // the copy is no longer needed
return;
}
SDL.handleEvent(event);
switch (event.type) {
case 'keydown': case 'keyup': {
var down = event.type === 'keydown';
//Module.print('Received key event: ' + event.keyCode);
var key = SDL.lookupKeyCodeForEvent(event);
var scan;
if (key >= 1024) {
scan = key - 1024;
} else {
scan = SDL.scanCodes[key] || key;
}
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
HEAP8[(((ptr)+(8))>>0)]=down ? 1 : 0;
HEAP8[(((ptr)+(9))>>0)]=0; // TODO
HEAP32[(((ptr)+(12))>>2)]=scan;
HEAP32[(((ptr)+(16))>>2)]=key;
HEAP16[(((ptr)+(20))>>1)]=SDL.modState;
// some non-character keys (e.g. backspace and tab) won't have keypressCharCode set, fill in with the keyCode.
HEAP32[(((ptr)+(24))>>2)]=event.keypressCharCode || key;
break;
}
case 'keypress': {
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
// Not filling in windowID for now
var cStr = intArrayFromString(String.fromCharCode(event.charCode));
for (var i = 0; i < cStr.length; ++i) {
HEAP8[(((ptr)+(8 + i))>>0)]=cStr[i];
}
break;
}
case 'mousedown': case 'mouseup': case 'mousemove': {
if (event.type != 'mousemove') {
var down = event.type === 'mousedown';
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
HEAP32[(((ptr)+(4))>>2)]=0;
HEAP32[(((ptr)+(8))>>2)]=0;
HEAP32[(((ptr)+(12))>>2)]=0;
HEAP8[(((ptr)+(16))>>0)]=event.button+1; // DOM buttons are 0-2, SDL 1-3
HEAP8[(((ptr)+(17))>>0)]=down ? 1 : 0;
HEAP32[(((ptr)+(20))>>2)]=Browser.mouseX;
HEAP32[(((ptr)+(24))>>2)]=Browser.mouseY;
} else {
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
HEAP32[(((ptr)+(4))>>2)]=0;
HEAP32[(((ptr)+(8))>>2)]=0;
HEAP32[(((ptr)+(12))>>2)]=0;
HEAP32[(((ptr)+(16))>>2)]=SDL.buttonState;
HEAP32[(((ptr)+(20))>>2)]=Browser.mouseX;
HEAP32[(((ptr)+(24))>>2)]=Browser.mouseY;
HEAP32[(((ptr)+(28))>>2)]=Browser.mouseMovementX;
HEAP32[(((ptr)+(32))>>2)]=Browser.mouseMovementY;
}
break;
}
case 'wheel': {
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
HEAP32[(((ptr)+(16))>>2)]=event.deltaX;
HEAP32[(((ptr)+(20))>>2)]=event.deltaY;
break;
}
case 'touchstart': case 'touchend': case 'touchmove': {
var touch = event.touch;
if (!Browser.touches[touch.identifier]) break;
var w = Module['canvas'].width;
var h = Module['canvas'].height;
var x = Browser.touches[touch.identifier].x / w;
var y = Browser.touches[touch.identifier].y / h;
var lx = Browser.lastTouches[touch.identifier].x / w;
var ly = Browser.lastTouches[touch.identifier].y / h;
var dx = x - lx;
var dy = y - ly;
if (touch['deviceID'] === undefined) touch.deviceID = SDL.TOUCH_DEFAULT_ID;
if (dx === 0 && dy === 0 && event.type === 'touchmove') return false; // don't send these if nothing happened
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
HEAP32[(((ptr)+(4))>>2)]=_SDL_GetTicks();
(tempI64 = [touch.deviceID>>>0,(tempDouble=touch.deviceID,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((ptr)+(8))>>2)]=tempI64[0],HEAP32[(((ptr)+(12))>>2)]=tempI64[1]);
(tempI64 = [touch.identifier>>>0,(tempDouble=touch.identifier,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((ptr)+(16))>>2)]=tempI64[0],HEAP32[(((ptr)+(20))>>2)]=tempI64[1]);
HEAPF32[(((ptr)+(24))>>2)]=x;
HEAPF32[(((ptr)+(28))>>2)]=y;
HEAPF32[(((ptr)+(32))>>2)]=dx;
HEAPF32[(((ptr)+(36))>>2)]=dy;
if (touch.force !== undefined) {
HEAPF32[(((ptr)+(40))>>2)]=touch.force;
} else { // No pressure data, send a digital 0/1 pressure.
HEAPF32[(((ptr)+(40))>>2)]=event.type == "touchend" ? 0 : 1;
}
break;
}
case 'unload': {
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
break;
}
case 'resize': {
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
HEAP32[(((ptr)+(4))>>2)]=event.w;
HEAP32[(((ptr)+(8))>>2)]=event.h;
break;
}
case 'joystick_button_up': case 'joystick_button_down': {
var state = event.type === 'joystick_button_up' ? 0 : 1;
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
HEAP8[(((ptr)+(4))>>0)]=event.index;
HEAP8[(((ptr)+(5))>>0)]=event.button;
HEAP8[(((ptr)+(6))>>0)]=state;
break;
}
case 'joystick_axis_motion': {
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
HEAP8[(((ptr)+(4))>>0)]=event.index;
HEAP8[(((ptr)+(5))>>0)]=event.axis;
HEAP32[(((ptr)+(8))>>2)]=SDL.joystickAxisValueConversion(event.value);
break;
}
case 'focus': {
var SDL_WINDOWEVENT_FOCUS_GAINED = 12 /* SDL_WINDOWEVENT_FOCUS_GAINED */;
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
HEAP32[(((ptr)+(4))>>2)]=0;
HEAP8[(((ptr)+(8))>>0)]=SDL_WINDOWEVENT_FOCUS_GAINED;
break;
}
case 'blur': {
var SDL_WINDOWEVENT_FOCUS_LOST = 13 /* SDL_WINDOWEVENT_FOCUS_LOST */;
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
HEAP32[(((ptr)+(4))>>2)]=0;
HEAP8[(((ptr)+(8))>>0)]=SDL_WINDOWEVENT_FOCUS_LOST;
break;
}
case 'visibilitychange': {
var SDL_WINDOWEVENT_SHOWN = 1 /* SDL_WINDOWEVENT_SHOWN */;
var SDL_WINDOWEVENT_HIDDEN = 2 /* SDL_WINDOWEVENT_HIDDEN */;
var visibilityEventID = event.visible ? SDL_WINDOWEVENT_SHOWN : SDL_WINDOWEVENT_HIDDEN;
HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
HEAP32[(((ptr)+(4))>>2)]=0;
HEAP8[(((ptr)+(8))>>0)]=visibilityEventID;
break;
}
default: throw 'Unhandled SDL event: ' + event.type;
}
},estimateTextWidth:function (fontData, text) {
var h = fontData.size;
var fontString = h + 'px ' + fontData.name;
var tempCtx = SDL.ttfContext;
tempCtx.save();
tempCtx.font = fontString;
var ret = tempCtx.measureText(text).width | 0;
tempCtx.restore();
return ret;
},allocateChannels:function (num) { // called from Mix_AllocateChannels and init
if (SDL.numChannels && SDL.numChannels >= num && num != 0) return;
SDL.numChannels = num;
SDL.channels = [];
for (var i = 0; i < num; i++) {
SDL.channels[i] = {
audio: null,
volume: 1.0
};
}
},setGetVolume:function (info, volume) {
if (!info) return 0;
var ret = info.volume * 128; // MIX_MAX_VOLUME
if (volume != -1) {
info.volume = Math.min(Math.max(volume, 0), 128) / 128;
if (info.audio) {
try {
info.audio.volume = info.volume; // For <audio> element
if (info.audio.webAudioGainNode) info.audio.webAudioGainNode['gain']['value'] = info.volume; // For WebAudio playback
} catch(e) {
Module.printErr('setGetVolume failed to set audio volume: ' + e);
}
}
}
return ret;
},setPannerPosition:function (info, x, y, z) {
if (!info) return;
if (info.audio) {
if (info.audio.webAudioPannerNode) {
info.audio.webAudioPannerNode['setPosition'](x, y, z);
}
}
},playWebAudio:function (audio) {
if (!audio) return;
if (audio.webAudioNode) return; // This instance is already playing, don't start again.
if (!SDL.webAudioAvailable()) return;
try {
var webAudio = audio.resource.webAudio;
audio.paused = false;
if (!webAudio.decodedBuffer) {
if (webAudio.onDecodeComplete === undefined) abort("Cannot play back audio object that was not loaded");
webAudio.onDecodeComplete.push(function() { if (!audio.paused) SDL.playWebAudio(audio); });
return;
}
audio.webAudioNode = SDL.audioContext['createBufferSource']();
audio.webAudioNode['buffer'] = webAudio.decodedBuffer;
audio.webAudioNode['loop'] = audio.loop;
audio.webAudioNode['onended'] = function() { audio['onended'](); } // For <media> element compatibility, route the onended signal to the instance.
audio.webAudioPannerNode = SDL.audioContext['createPanner']();
audio.webAudioPannerNode['panningModel'] = 'equalpower';
// Add an intermediate gain node to control volume.
audio.webAudioGainNode = SDL.audioContext['createGain']();
audio.webAudioGainNode['gain']['value'] = audio.volume;
audio.webAudioNode['connect'](audio.webAudioPannerNode);
audio.webAudioPannerNode['connect'](audio.webAudioGainNode);
audio.webAudioGainNode['connect'](SDL.audioContext['destination']);
audio.webAudioNode['start'](0, audio.currentPosition);
audio.startTime = SDL.audioContext['currentTime'] - audio.currentPosition;
} catch(e) {
Module.printErr('playWebAudio failed: ' + e);
}
},pauseWebAudio:function (audio) {
if (!audio) return;
if (audio.webAudioNode) {
try {
// Remember where we left off, so that if/when we resume, we can restart the playback at a proper place.
audio.currentPosition = (SDL.audioContext['currentTime'] - audio.startTime) % audio.resource.webAudio.decodedBuffer.duration;
// Important: When we reach here, the audio playback is stopped by the user. But when calling .stop() below, the Web Audio
// graph will send the onended signal, but we don't want to process that, since pausing should not clear/destroy the audio
// channel.
audio.webAudioNode['onended'] = undefined;
audio.webAudioNode.stop(0); // 0 is a default parameter, but WebKit is confused by it #3861
audio.webAudioNode = undefined;
} catch(e) {
Module.printErr('pauseWebAudio failed: ' + e);
}
}
audio.paused = true;
},openAudioContext:function () {
// Initialize Web Audio API if we haven't done so yet. Note: Only initialize Web Audio context ever once on the web page,
// since initializing multiple times fails on Chrome saying 'audio resources have been exhausted'.
if (!SDL.audioContext) {
if (typeof(AudioContext) !== 'undefined') SDL.audioContext = new AudioContext();
else if (typeof(webkitAudioContext) !== 'undefined') SDL.audioContext = new webkitAudioContext();
}
},webAudioAvailable:function () { return !!SDL.audioContext; },fillWebAudioBufferFromHeap:function (heapPtr, sizeSamplesPerChannel, dstAudioBuffer) {
// The input audio data is interleaved across the channels, i.e. [L, R, L, R, L, R, ...] and is either 8-bit or 16-bit as
// supported by the SDL API. The output audio wave data for Web Audio API must be in planar buffers of [-1,1]-normalized Float32 data,
// so perform a buffer conversion for the data.
var numChannels = SDL.audio.channels;
for(var c = 0; c < numChannels; ++c) {
var channelData = dstAudioBuffer['getChannelData'](c);
if (channelData.length != sizeSamplesPerChannel) {
throw 'Web Audio output buffer length mismatch! Destination size: ' + channelData.length + ' samples vs expected ' + sizeSamplesPerChannel + ' samples!';
}
if (SDL.audio.format == 0x8010 /*AUDIO_S16LSB*/) {
for(var j = 0; j < sizeSamplesPerChannel; ++j) {
channelData[j] = (HEAP16[(((heapPtr)+((j*numChannels + c)*2))>>1)]) / 0x8000;
}
} else if (SDL.audio.format == 0x0008 /*AUDIO_U8*/) {
for(var j = 0; j < sizeSamplesPerChannel; ++j) {
var v = (HEAP8[(((heapPtr)+(j*numChannels + c))>>0)]);
channelData[j] = ((v >= 0) ? v-128 : v+128) /128;
}
}
}
},debugSurface:function (surfData) {
console.log('dumping surface ' + [surfData.surf, surfData.source, surfData.width, surfData.height]);
var image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height);
var data = image.data;
var num = Math.min(surfData.width, surfData.height);
for (var i = 0; i < num; i++) {
console.log(' diagonal ' + i + ':' + [data[i*surfData.width*4 + i*4 + 0], data[i*surfData.width*4 + i*4 + 1], data[i*surfData.width*4 + i*4 + 2], data[i*surfData.width*4 + i*4 + 3]]);
}
},joystickEventState:1,lastJoystickState:{},joystickNamePool:{},recordJoystickState:function (joystick, state) {
// Standardize button state.
var buttons = new Array(state.buttons.length);
for (var i = 0; i < state.buttons.length; i++) {
buttons[i] = SDL.getJoystickButtonState(state.buttons[i]);
}
SDL.lastJoystickState[joystick] = {
buttons: buttons,
axes: state.axes.slice(0),
timestamp: state.timestamp,
index: state.index,
id: state.id
};
},getJoystickButtonState:function (button) {
if (typeof button === 'object') {
// Current gamepad API editor's draft (Firefox Nightly)
// https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#idl-def-GamepadButton
return button.pressed;
} else {
// Current gamepad API working draft (Firefox / Chrome Stable)
// http://www.w3.org/TR/2012/WD-gamepad-20120529/#gamepad-interface
return button > 0;
}
},queryJoysticks:function () {
for (var joystick in SDL.lastJoystickState) {
var state = SDL.getGamepad(joystick - 1);
var prevState = SDL.lastJoystickState[joystick];
// Check only if the timestamp has differed.
// NOTE: Timestamp is not available in Firefox.
if (typeof state.timestamp !== 'number' || state.timestamp !== prevState.timestamp) {
var i;
for (i = 0; i < state.buttons.length; i++) {
var buttonState = SDL.getJoystickButtonState(state.buttons[i]);
// NOTE: The previous state already has a boolean representation of
// its button, so no need to standardize its button state here.
if (buttonState !== prevState.buttons[i]) {
// Insert button-press event.
SDL.events.push({
type: buttonState ? 'joystick_button_down' : 'joystick_button_up',
joystick: joystick,
index: joystick - 1,
button: i
});
}
}
for (i = 0; i < state.axes.length; i++) {
if (state.axes[i] !== prevState.axes[i]) {
// Insert axes-change event.
SDL.events.push({
type: 'joystick_axis_motion',
joystick: joystick,
index: joystick - 1,
axis: i,
value: state.axes[i]
});
}
}
SDL.recordJoystickState(joystick, state);
}
}
},joystickAxisValueConversion:function (value) {
// Make sure value is properly clamped
value = Math.min(1, Math.max(value, -1));
// Ensures that 0 is 0, 1 is 32767, and -1 is 32768.
return Math.ceil(((value+1) * 32767.5) - 32768);
},getGamepads:function () {
var fcn = navigator.getGamepads || navigator.webkitGamepads || navigator.mozGamepads || navigator.gamepads || navigator.webkitGetGamepads;
if (fcn !== undefined) {
// The function must be applied on the navigator object.
return fcn.apply(navigator);
} else {
return [];
}
},getGamepad:function (deviceIndex) {
var gamepads = SDL.getGamepads();
if (gamepads.length > deviceIndex && deviceIndex >= 0) {
return gamepads[deviceIndex];
}
return null;
}};function _SDL_GL_SwapBuffers() {
if (Browser.doSwapBuffers) Browser.doSwapBuffers(); // in workers, this is used to send out a buffered frame
}
function _glUniform1iv(location, count, value) {
location = GL.uniforms[location];
value = HEAP32.subarray((value)>>2,(value+count*4)>>2);
GLctx.uniform1iv(location, value);
}
function _emscripten_glGetVertexAttribiv(index, pname, params) {
// N.B. This function may only be called if the vertex attribute was specified using the function glVertexAttrib*f(),
// otherwise the results are undefined. (GLES3 spec 6.1.12)
emscriptenWebGLGetVertexAttrib(index, pname, params, 'FloatToInteger');
}
function _glReadBuffer(x0) { GLctx['readBuffer'](x0) }
function _glDrawArraysInstanced(mode, first, count, primcount) {
GLctx['drawArraysInstanced'](mode, first, count, primcount);
}
function _glGenerateMipmap(x0) { GLctx['generateMipmap'](x0) }
function _emscripten_glGetPointerv() {
Module['printErr']('missing function: emscripten_glGetPointerv'); abort(-1);
}
function ___syscall140(which, varargs) {SYSCALLS.varargs = varargs;
try {
// llseek
var stream = SYSCALLS.getStreamFromFD(), offset_high = SYSCALLS.get(), offset_low = SYSCALLS.get(), result = SYSCALLS.get(), whence = SYSCALLS.get();
var offset = offset_low;
assert(offset_high === 0);
FS.llseek(stream, offset, whence);
HEAP32[((result)>>2)]=stream.position;
if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state
return 0;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall268(which, varargs) {SYSCALLS.varargs = varargs;
try {
// statfs64
var path = SYSCALLS.getStr(), size = SYSCALLS.get(), buf = SYSCALLS.get();
assert(size === 64);
// NOTE: None of the constants here are true. We're just returning safe and
// sane values.
HEAP32[(((buf)+(4))>>2)]=4096;
HEAP32[(((buf)+(40))>>2)]=4096;
HEAP32[(((buf)+(8))>>2)]=1000000;
HEAP32[(((buf)+(12))>>2)]=500000;
HEAP32[(((buf)+(16))>>2)]=500000;
HEAP32[(((buf)+(20))>>2)]=FS.nextInode;
HEAP32[(((buf)+(24))>>2)]=1000000;
HEAP32[(((buf)+(28))>>2)]=42;
HEAP32[(((buf)+(44))>>2)]=2; // ST_NOSUID
HEAP32[(((buf)+(36))>>2)]=255;
return 0;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall146(which, varargs) {SYSCALLS.varargs = varargs;
try {
// writev
var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get();
return SYSCALLS.doWritev(stream, iov, iovcnt);
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function __isLeapYear(year) {
return year%4 === 0 && (year%100 !== 0 || year%400 === 0);
}
function __arraySum(array, index) {
var sum = 0;
for (var i = 0; i <= index; sum += array[i++]);
return sum;
}
var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];
var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date, days) {
var newDate = new Date(date.getTime());
while(days > 0) {
var leap = __isLeapYear(newDate.getFullYear());
var currentMonth = newDate.getMonth();
var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth];
if (days > daysInCurrentMonth-newDate.getDate()) {
// we spill over to next month
days -= (daysInCurrentMonth-newDate.getDate()+1);
newDate.setDate(1);
if (currentMonth < 11) {
newDate.setMonth(currentMonth+1)
} else {
newDate.setMonth(0);
newDate.setFullYear(newDate.getFullYear()+1);
}
} else {
// we stay in current month
newDate.setDate(newDate.getDate()+days);
return newDate;
}
}
return newDate;
}function _strftime(s, maxsize, format, tm) {
// size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr);
// http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html
var tm_zone = HEAP32[(((tm)+(40))>>2)];
var date = {
tm_sec: HEAP32[((tm)>>2)],
tm_min: HEAP32[(((tm)+(4))>>2)],
tm_hour: HEAP32[(((tm)+(8))>>2)],
tm_mday: HEAP32[(((tm)+(12))>>2)],
tm_mon: HEAP32[(((tm)+(16))>>2)],
tm_year: HEAP32[(((tm)+(20))>>2)],
tm_wday: HEAP32[(((tm)+(24))>>2)],
tm_yday: HEAP32[(((tm)+(28))>>2)],
tm_isdst: HEAP32[(((tm)+(32))>>2)],
tm_gmtoff: HEAP32[(((tm)+(36))>>2)],
tm_zone: tm_zone ? Pointer_stringify(tm_zone) : ''
};
var pattern = Pointer_stringify(format);
// expand format
var EXPANSION_RULES_1 = {
'%c': '%a %b %d %H:%M:%S %Y', // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug 3 14:02:01 2013
'%D': '%m/%d/%y', // Equivalent to %m / %d / %y
'%F': '%Y-%m-%d', // Equivalent to %Y - %m - %d
'%h': '%b', // Equivalent to %b
'%r': '%I:%M:%S %p', // Replaced by the time in a.m. and p.m. notation
'%R': '%H:%M', // Replaced by the time in 24-hour notation
'%T': '%H:%M:%S', // Replaced by the time
'%x': '%m/%d/%y', // Replaced by the locale's appropriate date representation
'%X': '%H:%M:%S' // Replaced by the locale's appropriate date representation
};
for (var rule in EXPANSION_RULES_1) {
pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]);
}
var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
function leadingSomething(value, digits, character) {
var str = typeof value === 'number' ? value.toString() : (value || '');
while (str.length < digits) {
str = character[0]+str;
}
return str;
};
function leadingNulls(value, digits) {
return leadingSomething(value, digits, '0');
};
function compareByDay(date1, date2) {
function sgn(value) {
return value < 0 ? -1 : (value > 0 ? 1 : 0);
};
var compare;
if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) {
if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) {
compare = sgn(date1.getDate()-date2.getDate());
}
}
return compare;
};
function getFirstWeekStartDate(janFourth) {
switch (janFourth.getDay()) {
case 0: // Sunday
return new Date(janFourth.getFullYear()-1, 11, 29);
case 1: // Monday
return janFourth;
case 2: // Tuesday
return new Date(janFourth.getFullYear(), 0, 3);
case 3: // Wednesday
return new Date(janFourth.getFullYear(), 0, 2);
case 4: // Thursday
return new Date(janFourth.getFullYear(), 0, 1);
case 5: // Friday
return new Date(janFourth.getFullYear()-1, 11, 31);
case 6: // Saturday
return new Date(janFourth.getFullYear()-1, 11, 30);
}
};
function getWeekBasedYear(date) {
var thisDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday);
var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4);
var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4);
var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);
if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) {
// this date is after the start of the first week of this year
if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) {
return thisDate.getFullYear()+1;
} else {
return thisDate.getFullYear();
}
} else {
return thisDate.getFullYear()-1;
}
};
var EXPANSION_RULES_2 = {
'%a': function(date) {
return WEEKDAYS[date.tm_wday].substring(0,3);
},
'%A': function(date) {
return WEEKDAYS[date.tm_wday];
},
'%b': function(date) {
return MONTHS[date.tm_mon].substring(0,3);
},
'%B': function(date) {
return MONTHS[date.tm_mon];
},
'%C': function(date) {
var year = date.tm_year+1900;
return leadingNulls((year/100)|0,2);
},
'%d': function(date) {
return leadingNulls(date.tm_mday, 2);
},
'%e': function(date) {
return leadingSomething(date.tm_mday, 2, ' ');
},
'%g': function(date) {
// %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year.
// In this system, weeks begin on a Monday and week 1 of the year is the week that includes
// January 4th, which is also the week that includes the first Thursday of the year, and
// is also the first week that contains at least four days in the year.
// If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of
// the last week of the preceding year; thus, for Saturday 2nd January 1999,
// %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th,
// or 31st is a Monday, it and any following days are part of week 1 of the following year.
// Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01.
return getWeekBasedYear(date).toString().substring(2);
},
'%G': function(date) {
return getWeekBasedYear(date);
},
'%H': function(date) {
return leadingNulls(date.tm_hour, 2);
},
'%I': function(date) {
var twelveHour = date.tm_hour;
if (twelveHour == 0) twelveHour = 12;
else if (twelveHour > 12) twelveHour -= 12;
return leadingNulls(twelveHour, 2);
},
'%j': function(date) {
// Day of the year (001-366)
return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon-1), 3);
},
'%m': function(date) {
return leadingNulls(date.tm_mon+1, 2);
},
'%M': function(date) {
return leadingNulls(date.tm_min, 2);
},
'%n': function() {
return '\n';
},
'%p': function(date) {
if (date.tm_hour >= 0 && date.tm_hour < 12) {
return 'AM';
} else {
return 'PM';
}
},
'%S': function(date) {
return leadingNulls(date.tm_sec, 2);
},
'%t': function() {
return '\t';
},
'%u': function(date) {
var day = new Date(date.tm_year+1900, date.tm_mon+1, date.tm_mday, 0, 0, 0, 0);
return day.getDay() || 7;
},
'%U': function(date) {
// Replaced by the week number of the year as a decimal number [00,53].
// The first Sunday of January is the first day of week 1;
// days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday]
var janFirst = new Date(date.tm_year+1900, 0, 1);
var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7-janFirst.getDay());
var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday);
// is target date after the first Sunday?
if (compareByDay(firstSunday, endDate) < 0) {
// calculate difference in days between first Sunday and endDate
var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31;
var firstSundayUntilEndJanuary = 31-firstSunday.getDate();
var days = firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();
return leadingNulls(Math.ceil(days/7), 2);
}
return compareByDay(firstSunday, janFirst) === 0 ? '01': '00';
},
'%V': function(date) {
// Replaced by the week number of the year (Monday as the first day of the week)
// as a decimal number [01,53]. If the week containing 1 January has four
// or more days in the new year, then it is considered week 1.
// Otherwise, it is the last week of the previous year, and the next week is week 1.
// Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday]
var janFourthThisYear = new Date(date.tm_year+1900, 0, 4);
var janFourthNextYear = new Date(date.tm_year+1901, 0, 4);
var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);
var endDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday);
if (compareByDay(endDate, firstWeekStartThisYear) < 0) {
// if given date is before this years first week, then it belongs to the 53rd week of last year
return '53';
}
if (compareByDay(firstWeekStartNextYear, endDate) <= 0) {
// if given date is after next years first week, then it belongs to the 01th week of next year
return '01';
}
// given date is in between CW 01..53 of this calendar year
var daysDifference;
if (firstWeekStartThisYear.getFullYear() < date.tm_year+1900) {
// first CW of this year starts last year
daysDifference = date.tm_yday+32-firstWeekStartThisYear.getDate()
} else {
// first CW of this year starts this year
daysDifference = date.tm_yday+1-firstWeekStartThisYear.getDate();
}
return leadingNulls(Math.ceil(daysDifference/7), 2);
},
'%w': function(date) {
var day = new Date(date.tm_year+1900, date.tm_mon+1, date.tm_mday, 0, 0, 0, 0);
return day.getDay();
},
'%W': function(date) {
// Replaced by the week number of the year as a decimal number [00,53].
// The first Monday of January is the first day of week 1;
// days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday]
var janFirst = new Date(date.tm_year, 0, 1);
var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7-janFirst.getDay()+1);
var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday);
// is target date after the first Monday?
if (compareByDay(firstMonday, endDate) < 0) {
var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31;
var firstMondayUntilEndJanuary = 31-firstMonday.getDate();
var days = firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();
return leadingNulls(Math.ceil(days/7), 2);
}
return compareByDay(firstMonday, janFirst) === 0 ? '01': '00';
},
'%y': function(date) {
// Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year]
return (date.tm_year+1900).toString().substring(2);
},
'%Y': function(date) {
// Replaced by the year as a decimal number (for example, 1997). [ tm_year]
return date.tm_year+1900;
},
'%z': function(date) {
// Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ).
// For example, "-0430" means 4 hours 30 minutes behind UTC (west of Greenwich).
var off = date.tm_gmtoff;
var ahead = off >= 0;
off = Math.abs(off) / 60;
// convert from minutes into hhmm format (which means 60 minutes = 100 units)
off = (off / 60)*100 + (off % 60);
return (ahead ? '+' : '-') + String("0000" + off).slice(-4);
},
'%Z': function(date) {
return date.tm_zone;
},
'%%': function() {
return '%';
}
};
for (var rule in EXPANSION_RULES_2) {
if (pattern.indexOf(rule) >= 0) {
pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date));
}
}
var bytes = intArrayFromString(pattern, false);
if (bytes.length > maxsize) {
return 0;
}
writeArrayToMemory(bytes, s);
return bytes.length-1;
}
function ___syscall145(which, varargs) {SYSCALLS.varargs = varargs;
try {
// readv
var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get();
return SYSCALLS.doReadv(stream, iov, iovcnt);
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _emscripten_glStencilFuncSeparate(x0, x1, x2, x3) { GLctx['stencilFuncSeparate'](x0, x1, x2, x3) }
function _glUnmapBuffer() {
Module['printErr']('missing function: glUnmapBuffer'); abort(-1);
}
function ___resumeException(ptr) {
if (!EXCEPTIONS.last) { EXCEPTIONS.last = ptr; }
throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.";
}function ___cxa_find_matching_catch() {
var thrown = EXCEPTIONS.last;
if (!thrown) {
// just pass through the null ptr
return ((asm["setTempRet0"](0),0)|0);
}
var info = EXCEPTIONS.infos[thrown];
var throwntype = info.type;
if (!throwntype) {
// just pass through the thrown ptr
return ((asm["setTempRet0"](0),thrown)|0);
}
var typeArray = Array.prototype.slice.call(arguments);
var pointer = Module['___cxa_is_pointer_type'](throwntype);
// can_catch receives a **, add indirection
if (!___cxa_find_matching_catch.buffer) ___cxa_find_matching_catch.buffer = _malloc(4);
HEAP32[((___cxa_find_matching_catch.buffer)>>2)]=thrown;
thrown = ___cxa_find_matching_catch.buffer;
// The different catch blocks are denoted by different types.
// Due to inheritance, those types may not precisely match the
// type of the thrown object. Find one which matches, and
// return the type of the catch block which should be called.
for (var i = 0; i < typeArray.length; i++) {
if (typeArray[i] && Module['___cxa_can_catch'](typeArray[i], throwntype, thrown)) {
thrown = HEAP32[((thrown)>>2)]; // undo indirection
info.adjusted = thrown;
return ((asm["setTempRet0"](typeArray[i]),thrown)|0);
}
}
// Shouldn't happen unless we have bogus data in typeArray
// or encounter a type for which emscripten doesn't have suitable
// typeinfo defined. Best-efforts match just in case.
thrown = HEAP32[((thrown)>>2)]; // undo indirection
return ((asm["setTempRet0"](throwntype),thrown)|0);
}function ___cxa_throw(ptr, type, destructor) {
EXCEPTIONS.infos[ptr] = {
ptr: ptr,
adjusted: ptr,
type: type,
destructor: destructor,
refcount: 0,
caught: false,
rethrown: false
};
EXCEPTIONS.last = ptr;
if (!("uncaught_exception" in __ZSt18uncaught_exceptionv)) {
__ZSt18uncaught_exceptionv.uncaught_exception = 1;
} else {
__ZSt18uncaught_exceptionv.uncaught_exception++;
}
throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.";
}
function _emscripten_set_touchend_callback(target, userData, useCapture, callbackfunc) {
JSEvents.registerTouchEventCallback(target, userData, useCapture, callbackfunc, 23, "touchend");
return 0;
}
function _glUseProgram(program) {
GLctx.useProgram(program ? GL.programs[program] : null);
}
function _emscripten_glDisableVertexAttribArray(index) {
GLctx.disableVertexAttribArray(index);
}
function _glBindRenderbuffer(target, renderbuffer) {
GLctx.bindRenderbuffer(target, renderbuffer ? GL.renderbuffers[renderbuffer] : null);
}
function _emscripten_glGenRenderbuffers(n, renderbuffers) {
for (var i = 0; i < n; i++) {
var renderbuffer = GLctx.createRenderbuffer();
if (!renderbuffer) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
while(i < n) HEAP32[(((renderbuffers)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.renderbuffers);
renderbuffer.name = id;
GL.renderbuffers[id] = renderbuffer;
HEAP32[(((renderbuffers)+(i*4))>>2)]=id;
}
}
function _emscripten_glBlendEquation(x0) { GLctx['blendEquation'](x0) }
function ___syscall3(which, varargs) {SYSCALLS.varargs = varargs;
try {
// read
var stream = SYSCALLS.getStreamFromFD(), buf = SYSCALLS.get(), count = SYSCALLS.get();
return FS.read(stream, HEAP8,buf, count);
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _emscripten_glDepthFunc(x0) { GLctx['depthFunc'](x0) }
function _emscripten_set_deviceorientation_callback(userData, useCapture, callbackfunc) {
JSEvents.registerDeviceOrientationEventCallback(window, userData, useCapture, callbackfunc, 16, "deviceorientation");
return 0;
}
function ___assert_fail(condition, filename, line, func) {
ABORT = true;
throw 'Assertion failed: ' + Pointer_stringify(condition) + ', at: ' + [filename ? Pointer_stringify(filename) : 'unknown filename', line, func ? Pointer_stringify(func) : 'unknown function'] + ' at ' + stackTrace();
}
function _emscripten_glUniform4iv(location, count, value) {
location = GL.uniforms[location];
count *= 4;
value = HEAP32.subarray((value)>>2,(value+count*4)>>2);
GLctx.uniform4iv(location, value);
}
function _emscripten_glLoadIdentity(){ throw 'Legacy GL function (glLoadIdentity) called. If you want legacy GL emulation, you need to compile with -s LEGACY_GL_EMULATION=1 to enable legacy GL emulation.'; }
function _emscripten_glVertexAttribDivisor(index, divisor) {
GLctx['vertexAttribDivisor'](index, divisor);
}
function _glActiveTexture(x0) { GLctx['activeTexture'](x0) }
function _glEnableVertexAttribArray(index) {
GLctx.enableVertexAttribArray(index);
}
function _glReadPixels(x, y, width, height, format, type, pixels) {
var pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, format);
if (!pixelData) {
GL.recordError(0x0500/*GL_INVALID_ENUM*/);
return;
}
GLctx.readPixels(x, y, width, height, format, type, pixelData);
}
function _emscripten_glDrawElementsInstanced(mode, count, type, indices, primcount) {
GLctx['drawElementsInstanced'](mode, count, type, indices, primcount);
}
function _emscripten_glGetRenderbufferParameteriv(target, pname, params) {
if (!params) {
// GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense
// if params == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
HEAP32[((params)>>2)]=GLctx.getRenderbufferParameter(target, pname);
}
function _glUniformMatrix3fv(location, count, transpose, value) {
location = GL.uniforms[location];
var view;
if (9*count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[9*count-1];
for (var i = 0; i < 9*count; i += 9) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)];
view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)];
view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)];
view[i+4] = HEAPF32[(((value)+(4*i+16))>>2)];
view[i+5] = HEAPF32[(((value)+(4*i+20))>>2)];
view[i+6] = HEAPF32[(((value)+(4*i+24))>>2)];
view[i+7] = HEAPF32[(((value)+(4*i+28))>>2)];
view[i+8] = HEAPF32[(((value)+(4*i+32))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*36)>>2);
}
GLctx.uniformMatrix3fv(location, !!transpose, view);
}
function _emscripten_webgl_create_context(target, attributes) {
var contextAttributes = {};
contextAttributes['alpha'] = !!HEAP32[((attributes)>>2)];
contextAttributes['depth'] = !!HEAP32[(((attributes)+(4))>>2)];
contextAttributes['stencil'] = !!HEAP32[(((attributes)+(8))>>2)];
contextAttributes['antialias'] = !!HEAP32[(((attributes)+(12))>>2)];
contextAttributes['premultipliedAlpha'] = !!HEAP32[(((attributes)+(16))>>2)];
contextAttributes['preserveDrawingBuffer'] = !!HEAP32[(((attributes)+(20))>>2)];
contextAttributes['preferLowPowerToHighPerformance'] = !!HEAP32[(((attributes)+(24))>>2)];
contextAttributes['failIfMajorPerformanceCaveat'] = !!HEAP32[(((attributes)+(28))>>2)];
contextAttributes['majorVersion'] = HEAP32[(((attributes)+(32))>>2)];
contextAttributes['minorVersion'] = HEAP32[(((attributes)+(36))>>2)];
var enableExtensionsByDefault = HEAP32[(((attributes)+(40))>>2)];
contextAttributes['explicitSwapControl'] = HEAP32[(((attributes)+(44))>>2)];
target = Pointer_stringify(target);
var canvas;
if ((!target || target === '#canvas') && Module['canvas']) {
canvas = Module['canvas'].id ? (GL.offscreenCanvases[Module['canvas'].id] || JSEvents.findEventTarget(Module['canvas'].id)) : Module['canvas'];
} else {
canvas = GL.offscreenCanvases[target] || JSEvents.findEventTarget(target);
}
if (!canvas) {
return 0;
}
if (contextAttributes['explicitSwapControl']) {
console.error('emscripten_webgl_create_context failed: explicitSwapControl is not supported, please rebuild with -s OFFSCREENCANVAS_SUPPORT=1 to enable targeting the experimental OffscreenCanvas specification!');
return 0;
}
var contextHandle = GL.createContext(canvas, contextAttributes);
return contextHandle;
}
function _pthread_cleanup_pop() {
assert(_pthread_cleanup_push.level == __ATEXIT__.length, 'cannot pop if something else added meanwhile!');
__ATEXIT__.pop();
_pthread_cleanup_push.level = __ATEXIT__.length;
}
function _emscripten_glClearStencil(x0) { GLctx['clearStencil'](x0) }
function _emscripten_glDetachShader(program, shader) {
GLctx.detachShader(GL.programs[program],
GL.shaders[shader]);
}
function _JS_Sound_Stop(channelInstance, delay)
{
if (WEBAudio.audioWebEnabled == 0)
return;
var channel = WEBAudio.audioInstances[channelInstance];
// stop sound currently playing.
if (channel.source.buffer)
{
try {
channel.source.stop(WEBAudio.audioContext.currentTime + delay);
} catch (e) {
// when stop() is used more than once for the same source in Safari it causes the following exception:
// InvalidStateError: DOM Exception 11: An attempt was made to use an object that is not, or is no longer, usable.
channel.source.disconnect();
}
if (delay == 0)
{
// disable callback for this channel when manually stopped.
channel.source.onended = function(){};
// recreate channel for future use.
channel.setup();
}
}
}
function _emscripten_glDeleteVertexArrays(n, vaos) {
for (var i = 0; i < n; i++) {
var id = HEAP32[(((vaos)+(i*4))>>2)];
GLctx['deleteVertexArray'](GL.vaos[id]);
GL.vaos[id] = null;
}
}
function _JS_Eval_OpenURL(ptr)
{
var str = Pointer_stringify(ptr);
location.href = str;
}
function _pthread_mutex_destroy() {}
function _glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding) {
program = GL.programs[program];
GLctx['uniformBlockBinding'](program, uniformBlockIndex, uniformBlockBinding);
}
function _pthread_cond_destroy() { return 0; }
function _emscripten_glGenerateMipmap(x0) { GLctx['generateMipmap'](x0) }
function _getpwuid(uid) {
return 0; // NULL
}
function _emscripten_glCullFace(x0) { GLctx['cullFace'](x0) }
function _emscripten_glUseProgram(program) {
GLctx.useProgram(program ? GL.programs[program] : null);
}
function _emscripten_glUniformMatrix4fv(location, count, transpose, value) {
location = GL.uniforms[location];
var view;
if (16*count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[16*count-1];
for (var i = 0; i < 16*count; i += 16) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)];
view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)];
view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)];
view[i+4] = HEAPF32[(((value)+(4*i+16))>>2)];
view[i+5] = HEAPF32[(((value)+(4*i+20))>>2)];
view[i+6] = HEAPF32[(((value)+(4*i+24))>>2)];
view[i+7] = HEAPF32[(((value)+(4*i+28))>>2)];
view[i+8] = HEAPF32[(((value)+(4*i+32))>>2)];
view[i+9] = HEAPF32[(((value)+(4*i+36))>>2)];
view[i+10] = HEAPF32[(((value)+(4*i+40))>>2)];
view[i+11] = HEAPF32[(((value)+(4*i+44))>>2)];
view[i+12] = HEAPF32[(((value)+(4*i+48))>>2)];
view[i+13] = HEAPF32[(((value)+(4*i+52))>>2)];
view[i+14] = HEAPF32[(((value)+(4*i+56))>>2)];
view[i+15] = HEAPF32[(((value)+(4*i+60))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*64)>>2);
}
GLctx.uniformMatrix4fv(location, !!transpose, view);
}
function _emscripten_glUniform2fv(location, count, value) {
location = GL.uniforms[location];
var view;
if (2*count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[2*count-1];
for (var i = 0; i < 2*count; i += 2) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*8)>>2);
}
GLctx.uniform2fv(location, view);
}
function _glGetShaderInfoLog(shader, maxLength, length, infoLog) {
var log = GLctx.getShaderInfoLog(GL.shaders[shader]);
if (log === null) log = '(unknown error)';
if (maxLength > 0 && infoLog) {
var numBytesWrittenExclNull = stringToUTF8(log, infoLog, maxLength);
if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull;
} else {
if (length) HEAP32[((length)>>2)]=0;
}
}
function _emscripten_glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer) {
GLctx.framebufferRenderbuffer(target, attachment, renderbuffertarget,
GL.renderbuffers[renderbuffer]);
}
function _emscripten_glDeleteFramebuffers(n, framebuffers) {
for (var i = 0; i < n; ++i) {
var id = HEAP32[(((framebuffers)+(i*4))>>2)];
var framebuffer = GL.framebuffers[id];
if (!framebuffer) continue; // GL spec: "glDeleteFramebuffers silently ignores 0s and names that do not correspond to existing framebuffer objects".
GLctx.deleteFramebuffer(framebuffer);
framebuffer.name = 0;
GL.framebuffers[id] = null;
}
}
function _emscripten_glUniform2iv(location, count, value) {
location = GL.uniforms[location];
count *= 2;
value = HEAP32.subarray((value)>>2,(value+count*4)>>2);
GLctx.uniform2iv(location, value);
}
function _emscripten_glVertexAttrib1fv(index, v) {
var view = GL.miniTempBufferViews[0];
view[0] = HEAPF32[v >> 2];
GLctx.vertexAttrib1fv(index, view);
}
var cttz_i8 = allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0], "i8", ALLOC_STATIC);function _llvm_cttz_i32(x) {
x = x|0;
var ret = 0;
ret = ((HEAP8[(((cttz_i8)+(x & 0xff))>>0)])|0);
if ((ret|0) < 8) return ret|0;
ret = ((HEAP8[(((cttz_i8)+((x >> 8)&0xff))>>0)])|0);
if ((ret|0) < 8) return (ret + 8)|0;
ret = ((HEAP8[(((cttz_i8)+((x >> 16)&0xff))>>0)])|0);
if ((ret|0) < 8) return (ret + 16)|0;
return (((HEAP8[(((cttz_i8)+(x >>> 24))>>0)])|0) + 24)|0;
}
var _emscripten_asm_const_int=true;
function _glGenBuffers(n, buffers) {
for (var i = 0; i < n; i++) {
var buffer = GLctx.createBuffer();
if (!buffer) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
while(i < n) HEAP32[(((buffers)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.buffers);
buffer.name = id;
GL.buffers[id] = buffer;
HEAP32[(((buffers)+(i*4))>>2)]=id;
}
}
function _emscripten_glBindVertexArray(vao) {
GLctx['bindVertexArray'](GL.vaos[vao]);
}
function _glCreateProgram() {
var id = GL.getNewId(GL.programs);
var program = GLctx.createProgram();
program.name = id;
GL.programs[id] = program;
return id;
}
function _glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, data) {
GLctx['texImage3D'](target, level, internalFormat, width, height, depth, border, format, type,
HEAPU8.subarray(data));
}
function _emscripten_glGetBufferParameteriv(target, value, data) {
if (!data) {
// GLES2 specification does not specify how to behave if data is a null pointer. Since calling this function does not make sense
// if data == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
HEAP32[((data)>>2)]=GLctx.getBufferParameter(target, value);
}
function _emscripten_glGetUniformiv(program, location, params) {
emscriptenWebGLGetUniform(program, location, params, 'Integer');
}
function _JS_SystemInfo_GetBrowserVersionString(buffer, bufferSize)
{
var browserVer = UnityLoader.SystemInfo.browserVersion;
if (buffer)
stringToUTF8(browserVer, buffer, bufferSize);
return lengthBytesUTF8(browserVer);
}
function _pthread_cond_wait() { return 0; }
function _JS_WebRequest_SetRequestHeader(request, header, value)
{
var _header = Pointer_stringify(header);
var _value = Pointer_stringify(value);
wr.requestInstances[request].setRequestHeader(_header, _value);
}
function _JS_Sound_Load(ptr, length)
{
if (WEBAudio.audioWebEnabled == 0)
return 0;
var sound = {
buffer: null,
error: false
};
var instance = WEBAudio.audioInstances.push(sound) - 1;
WEBAudio.audioContext.decodeAudioData(
HEAPU8.buffer.slice(ptr, ptr+length),
function(buffer)
{
sound.buffer = buffer;
},
function ()
{
sound.error = true;
console.log ("Decode error.");
}
);
return instance;
}
function _JS_Eval_ClearTimeout(id)
{
window.clearTimeout(id);
}
function _emscripten_glUniform1fv(location, count, value) {
location = GL.uniforms[location];
var view;
if (count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[count-1];
for (var i = 0; i < count; ++i) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*4)>>2);
}
GLctx.uniform1fv(location, view);
}
function _glDeleteBuffers(n, buffers) {
for (var i = 0; i < n; i++) {
var id = HEAP32[(((buffers)+(i*4))>>2)];
var buffer = GL.buffers[id];
// From spec: "glDeleteBuffers silently ignores 0's and names that do not
// correspond to existing buffer objects."
if (!buffer) continue;
GLctx.deleteBuffer(buffer);
buffer.name = 0;
GL.buffers[id] = null;
if (id == GL.currArrayBuffer) GL.currArrayBuffer = 0;
if (id == GL.currElementArrayBuffer) GL.currElementArrayBuffer = 0;
}
}
function _glScissor(x0, x1, x2, x3) { GLctx['scissor'](x0, x1, x2, x3) }
function _JS_SystemInfo_GetLanguage(buffer, bufferSize)
{
var language = UnityLoader.SystemInfo.language;
if (buffer)
stringToUTF8(language, buffer, bufferSize);
return lengthBytesUTF8(language);
}
function _emscripten_glCheckFramebufferStatus(x0) { return GLctx['checkFramebufferStatus'](x0) }
function _emscripten_glDeleteProgram(id) {
if (!id) return;
var program = GL.programs[id];
if (!program) { // glDeleteProgram actually signals an error when deleting a nonexisting object, unlike some other GL delete functions.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
GLctx.deleteProgram(program);
program.name = 0;
GL.programs[id] = null;
GL.programInfos[id] = null;
}
function _emscripten_glDisable(x0) { GLctx['disable'](x0) }
function _glUniform3uiv(location, count, value) {
location = GL.uniforms[location];
count *= 3;
value = HEAPU32.subarray((value)>>2,(value+count*4)>>2);
GLctx.uniform3uiv(location, value);
}
function _glClearColor(x0, x1, x2, x3) { GLctx['clearColor'](x0, x1, x2, x3) }
function _emscripten_glGetActiveAttrib(program, index, bufSize, length, size, type, name) {
program = GL.programs[program];
var info = GLctx.getActiveAttrib(program, index);
if (!info) return; // If an error occurs, nothing will be written to length, size and type and name.
if (bufSize > 0 && name) {
var numBytesWrittenExclNull = stringToUTF8(info.name, name, bufSize);
if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull;
} else {
if (length) HEAP32[((length)>>2)]=0;
}
if (size) HEAP32[((size)>>2)]=info.size;
if (type) HEAP32[((type)>>2)]=info.type;
}
function _emscripten_glLineWidth(x0) { GLctx['lineWidth'](x0) }
function _emscripten_glGetString(name_) {
if (GL.stringCache[name_]) return GL.stringCache[name_];
var ret;
switch(name_) {
case 0x1F00 /* GL_VENDOR */:
case 0x1F01 /* GL_RENDERER */:
case 0x9245 /* UNMASKED_VENDOR_WEBGL */:
case 0x9246 /* UNMASKED_RENDERER_WEBGL */:
ret = allocate(intArrayFromString(GLctx.getParameter(name_)), 'i8', ALLOC_NORMAL);
break;
case 0x1F02 /* GL_VERSION */:
var glVersion = GLctx.getParameter(GLctx.VERSION);
// return GLES version string corresponding to the version of the WebGL context
if (GLctx.canvas.GLctxObject.version >= 2) glVersion = 'OpenGL ES 3.0 (' + glVersion + ')';
else
{
glVersion = 'OpenGL ES 2.0 (' + glVersion + ')';
}
ret = allocate(intArrayFromString(glVersion), 'i8', ALLOC_NORMAL);
break;
case 0x1F03 /* GL_EXTENSIONS */:
var exts = GLctx.getSupportedExtensions();
var gl_exts = [];
for (var i in exts) {
gl_exts.push(exts[i]);
gl_exts.push("GL_" + exts[i]);
}
ret = allocate(intArrayFromString(gl_exts.join(' ')), 'i8', ALLOC_NORMAL);
break;
case 0x8B8C /* GL_SHADING_LANGUAGE_VERSION */:
var glslVersion = GLctx.getParameter(GLctx.SHADING_LANGUAGE_VERSION);
// extract the version number 'N.M' from the string 'WebGL GLSL ES N.M ...'
var ver_re = /^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;
var ver_num = glslVersion.match(ver_re);
if (ver_num !== null) {
if (ver_num[1].length == 3) ver_num[1] = ver_num[1] + '0'; // ensure minor version has 2 digits
glslVersion = 'OpenGL ES GLSL ES ' + ver_num[1] + ' (' + glslVersion + ')';
}
ret = allocate(intArrayFromString(glslVersion), 'i8', ALLOC_NORMAL);
break;
default:
GL.recordError(0x0500/*GL_INVALID_ENUM*/);
return 0;
}
GL.stringCache[name_] = ret;
return ret;
}
function _emscripten_glGetAttribLocation(program, name) {
program = GL.programs[program];
name = Pointer_stringify(name);
return GLctx.getAttribLocation(program, name);
}
function _emscripten_glGetIntegerv(name_, p) {
emscriptenWebGLGet(name_, p, 'Integer');
}
function _glGetStringi(name, index) {
if (GLctx.canvas.GLctxObject.version < 2) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */); // Calling GLES3/WebGL2 function with a GLES2/WebGL1 context
return 0;
}
var stringiCache = GL.stringiCache[name];
if (stringiCache) {
if (index < 0 || index >= stringiCache.length) {
GL.recordError(0x0501/*GL_INVALID_VALUE*/);
return 0;
}
return stringiCache[index];
}
switch(name) {
case 0x1F03 /* GL_EXTENSIONS */:
var exts = GLctx.getSupportedExtensions();
var gl_exts = [];
// each extension is duplicated, first in unprefixed WebGL form, and then a second time with "GL_" prefix.
for (var i in exts) {
gl_exts.push(allocate(intArrayFromString(exts[i]), 'i8', ALLOC_NORMAL));
gl_exts.push(allocate(intArrayFromString("GL_" + exts[i]), 'i8', ALLOC_NORMAL));
}
stringiCache = GL.stringiCache[name] = gl_exts;
if (index < 0 || index >= stringiCache.length) {
GL.recordError(0x0501/*GL_INVALID_VALUE*/);
return 0;
}
return stringiCache[index];
default:
GL.recordError(0x0500/*GL_INVALID_ENUM*/);
return 0;
}
}
function _JS_Sound_SetLoop(channelInstance, loop)
{
if (WEBAudio.audioWebEnabled == 0)
return;
WEBAudio.audioInstances[channelInstance].source.loop = loop;
}
function _JS_Sound_Load_PCM(channels, length, sampleRate, ptr)
{
if (WEBAudio.audioWebEnabled == 0)
return 0;
var sound = {
buffer: WEBAudio.audioContext.createBuffer(channels, length, sampleRate),
error: false
};
for (var i = 0; i < channels; i++)
{
var offs = (ptr>>2) + length * i;
var buffer = sound.buffer;
var copyToChannel = buffer['copyToChannel'] || function (source, channelNumber, startInChannel)
{
// Shim for copyToChannel on browsers which don't support it like Safari.
var clipped = source.subarray(0, Math.min(source.length, this.length - (startInChannel | 0)));
this.getChannelData(channelNumber | 0).set(clipped, startInChannel | 0);
};
copyToChannel.apply(buffer, [HEAPF32.subarray(offs, offs + length),i, 0]);
}
var instance = WEBAudio.audioInstances.push(sound) - 1;
return instance;
}
function _glUniform2fv(location, count, value) {
location = GL.uniforms[location];
var view;
if (2*count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[2*count-1];
for (var i = 0; i < 2*count; i += 2) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*8)>>2);
}
GLctx.uniform2fv(location, view);
}
function _emscripten_glReadPixels(x, y, width, height, format, type, pixels) {
var pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, format);
if (!pixelData) {
GL.recordError(0x0500/*GL_INVALID_ENUM*/);
return;
}
GLctx.readPixels(x, y, width, height, format, type, pixelData);
}
function __setLetterbox(element, topBottom, leftRight) {
if (JSEvents.isInternetExplorer()) {
// Cannot use padding on IE11, because IE11 computes padding in addition to the size, unlike
// other browsers, which treat padding to be part of the size.
// e.g.
// FF, Chrome: If CSS size = 1920x1080, padding-leftright = 460, padding-topbottomx40, then content size = (1920 - 2*460) x (1080-2*40) = 1000x1000px, and total element size = 1920x1080px.
// IE11: If CSS size = 1920x1080, padding-leftright = 460, padding-topbottomx40, then content size = 1920x1080px and total element size = (1920+2*460) x (1080+2*40)px.
// IE11 treats margin like Chrome and FF treat padding.
element.style.marginLeft = element.style.marginRight = leftRight + 'px';
element.style.marginTop = element.style.marginBottom = topBottom + 'px';
} else {
// Cannot use margin to specify letterboxes in FF or Chrome, since those ignore margins in fullscreen mode.
element.style.paddingLeft = element.style.paddingRight = leftRight + 'px';
element.style.paddingTop = element.style.paddingBottom = topBottom + 'px';
}
}function _emscripten_do_request_fullscreen(target, strategy) {
if (typeof JSEvents.fullscreenEnabled() === 'undefined') return -1;
if (!JSEvents.fullscreenEnabled()) return -3;
if (!target) target = '#canvas';
target = JSEvents.findEventTarget(target);
if (!target) return -4;
if (!target.requestFullscreen && !target.msRequestFullscreen && !target.mozRequestFullScreen && !target.mozRequestFullscreen && !target.webkitRequestFullscreen) {
return -3;
}
var canPerformRequests = JSEvents.canPerformEventHandlerRequests();
// Queue this function call if we're not currently in an event handler and the user saw it appropriate to do so.
if (!canPerformRequests) {
if (strategy.deferUntilInEventHandler) {
JSEvents.deferCall(JSEvents.requestFullscreen, 1 /* priority over pointer lock */, [target, strategy]);
return 1;
} else {
return -2;
}
}
return JSEvents.requestFullscreen(target, strategy);
}function _emscripten_request_fullscreen(target, deferUntilInEventHandler) {
var strategy = {};
// These options perform no added logic, but just bare request fullscreen.
strategy.scaleMode = 0;
strategy.canvasResolutionScaleMode = 0;
strategy.filteringMode = 0;
strategy.deferUntilInEventHandler = deferUntilInEventHandler;
return _emscripten_do_request_fullscreen(target, strategy);
}
function _emscripten_glGetError() {
// First return any GL error generated by the emscripten library_gl.js interop layer.
if (GL.lastError) {
var error = GL.lastError;
GL.lastError = 0/*GL_NO_ERROR*/;
return error;
} else { // If there were none, return the GL error from the browser GL context.
return GLctx.getError();
}
}
function _emscripten_glFramebufferTexture2D(target, attachment, textarget, texture, level) {
GLctx.framebufferTexture2D(target, attachment, textarget,
GL.textures[texture], level);
}
function ___syscall39(which, varargs) {SYSCALLS.varargs = varargs;
try {
// mkdir
var path = SYSCALLS.getStr(), mode = SYSCALLS.get();
return SYSCALLS.doMkdir(path, mode);
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall38(which, varargs) {SYSCALLS.varargs = varargs;
try {
// rename
var old_path = SYSCALLS.getStr(), new_path = SYSCALLS.getStr();
FS.rename(old_path, new_path);
return 0;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function ___syscall33(which, varargs) {SYSCALLS.varargs = varargs;
try {
// access
var path = SYSCALLS.getStr(), amode = SYSCALLS.get();
return SYSCALLS.doAccess(path, amode);
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _glClearDepthf(x0) { GLctx['clearDepth'](x0) }
function _glGenTransformFeedbacks(n, ids) {
for (var i = 0; i < n; i++) {
var transformFeedback = GLctx['createTransformFeedback']();
if (!transformFeedback) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
while(i < n) HEAP32[(((ids)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.transformFeedbacks);
transformFeedback.name = id;
GL.transformFeedbacks[id] = transformFeedback;
HEAP32[(((ids)+(i*4))>>2)]=id;
}
}
Module["_memmove"] = _memmove;
function _glDepthFunc(x0) { GLctx['depthFunc'](x0) }
function _glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data) {
var heapView;
if (data) {
heapView = HEAPU8.subarray((data),(data+imageSize));
} else {
heapView = null;
}
GLctx['compressedTexSubImage2D'](target, level, xoffset, yoffset, width, height, format, heapView);
}
function _glGenTextures(n, textures) {
for (var i = 0; i < n; i++) {
var texture = GLctx.createTexture();
if (!texture) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */); // GLES + EGL specs don't specify what should happen here, so best to issue an error and create IDs with 0.
while(i < n) HEAP32[(((textures)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.textures);
texture.name = id;
GL.textures[id] = texture;
HEAP32[(((textures)+(i*4))>>2)]=id;
}
}
function _glProgramBinary(program, binaryFormat, binary, length) {
GL.recordError(0x0500/*GL_INVALID_ENUM*/);
}
function _JS_SystemInfo_GetHeight()
{
return UnityLoader.SystemInfo.height;
}
function _JS_SystemInfo_GetOS(buffer, bufferSize)
{
var browser = UnityLoader.SystemInfo.os + " " + UnityLoader.SystemInfo.osVersion;
if (buffer)
stringToUTF8(browser, buffer, bufferSize);
return lengthBytesUTF8(browser);
}
function ___syscall51(which, varargs) {SYSCALLS.varargs = varargs;
try {
// acct
return -ERRNO_CODES.ENOSYS; // unsupported features
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}function ___syscall42() {
return ___syscall51.apply(null, arguments)
}
Module["_llvm_ctlz_i64"] = _llvm_ctlz_i64;
function _JS_WebRequest_SetResponseHandler(request, arg, onresponse)
{
var http = wr.requestInstances[request];
// LOAD
http.onload = function http_onload(e) {
if (onresponse)
{
var byteArray = new Uint8Array(http.response);
// 200 is successful http request, 0 is returned by non-http requests (file:).
if (byteArray.length != 0)
{
var buffer = _malloc(byteArray.length);
HEAPU8.set(byteArray, buffer);
Runtime.dynCall('viiiii', onresponse, [arg, http.status, buffer, byteArray.length, 0]);
}
else
{
Runtime.dynCall('viiiii', onresponse, [arg, http.status, 0, 0, 0]);
}
}
};
function HandleError(err)
{
if (onresponse)
{
var len = lengthBytesUTF8(err) + 1;
var buffer = _malloc(len);
stringToUTF8(err, buffer, len);
Runtime.dynCall('viiiii', onresponse, [arg, http.status, 0, 0, buffer]);
_free(buffer);
}
}
// ERROR
http.onerror = function http_onerror(e) {
HandleError ("Unknown error.");
};
http.ontimeout = function http_onerror(e) {
HandleError ("Connection timed out.");
};
http.onabort = function http_onerror(e) {
HandleError ("Aborted.");
};
}
function _JS_SystemInfo_GetWidth()
{
return UnityLoader.SystemInfo.width;
}
function _glClientWaitSync(sync, flags, timeoutLo, timeoutHi) {
// WebGL2 vs GLES3 differences: in GLES3, the timeout parameter is a uint64, where 0xFFFFFFFFFFFFFFFFULL means GL_TIMEOUT_IGNORED.
// In JS, there's no 64-bit value types, so instead timeout is taken to be signed, and GL_TIMEOUT_IGNORED is given value -1.
// Inherently the value accepted in the timeout is lossy, and can't take in arbitrary u64 bit pattern (but most likely doesn't matter)
// See https://www.khronos.org/registry/webgl/specs/latest/2.0/#5.15
timeoutLo == timeoutLo >>> 0;
timeoutHi == timeoutHi >>> 0;
var timeout = (timeoutLo == 0xFFFFFFFF && timeoutHi == 0xFFFFFFFF) ? -1 : Runtime.makeBigInt(timeoutLo, timeoutHi, true);
return GLctx.clientWaitSync(GL.syncs[sync], flags, timeout);
}
function _emscripten_glGetUniformfv(program, location, params) {
emscriptenWebGLGetUniform(program, location, params, 'Float');
}
function ___gxx_personality_v0() {
}
function _emscripten_exit_pointerlock() {
// Make sure no queued up calls will fire after this.
JSEvents.removeDeferredCalls(JSEvents.requestPointerLock);
if (document.exitPointerLock) {
document.exitPointerLock();
} else if (document.msExitPointerLock) {
document.msExitPointerLock();
} else if (document.mozExitPointerLock) {
document.mozExitPointerLock();
} else if (document.webkitExitPointerLock) {
document.webkitExitPointerLock();
} else {
return -1;
}
return 0;
}
function _emscripten_glBindBuffer(target, buffer) {
var bufferObj = buffer ? GL.buffers[buffer] : null;
GLctx.bindBuffer(target, bufferObj);
}
function _glBlendEquation(x0) { GLctx['blendEquation'](x0) }
function _glGetUniformLocation(program, name) {
name = Pointer_stringify(name);
var arrayOffset = 0;
// If user passed an array accessor "[index]", parse the array index off the accessor.
if (name.indexOf(']', name.length-1) !== -1) {
var ls = name.lastIndexOf('[');
var arrayIndex = name.slice(ls+1, -1);
if (arrayIndex.length > 0) {
arrayOffset = parseInt(arrayIndex);
if (arrayOffset < 0) {
return -1;
}
}
name = name.slice(0, ls);
}
var ptable = GL.programInfos[program];
if (!ptable) {
return -1;
}
var utable = ptable.uniforms;
var uniformInfo = utable[name]; // returns pair [ dimension_of_uniform_array, uniform_location ]
if (uniformInfo && arrayOffset < uniformInfo[0]) { // Check if user asked for an out-of-bounds element, i.e. for 'vec4 colors[3];' user could ask for 'colors[10]' which should return -1.
return uniformInfo[1]+arrayOffset;
} else {
return -1;
}
}
function _emscripten_glFinish() { GLctx['finish']() }
function _glEndTransformFeedback() { GLctx['endTransformFeedback']() }
function _emscripten_glUniform1iv(location, count, value) {
location = GL.uniforms[location];
value = HEAP32.subarray((value)>>2,(value+count*4)>>2);
GLctx.uniform1iv(location, value);
}
function _glUniform4fv(location, count, value) {
location = GL.uniforms[location];
var view;
if (4*count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[4*count-1];
for (var i = 0; i < 4*count; i += 4) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)];
view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)];
view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*16)>>2);
}
GLctx.uniform4fv(location, view);
}
function _emscripten_glTexCoordPointer() {
Module['printErr']('missing function: emscripten_glTexCoordPointer'); abort(-1);
}
function _glBeginTransformFeedback(x0) { GLctx['beginTransformFeedback'](x0) }
function __exit(status) {
// void _exit(int status);
// http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html
Module['exit'](status);
}function _exit(status) {
__exit(status);
}
function _pthread_setspecific(key, value) {
if (!(key in PTHREAD_SPECIFIC)) {
return ERRNO_CODES.EINVAL;
}
PTHREAD_SPECIFIC[key] = value;
return 0;
}
function _emscripten_glVertexAttrib1f(x0, x1) { GLctx['vertexAttrib1f'](x0, x1) }
function _glDeleteTransformFeedbacks(n, ids) {
for (var i = 0; i < n; i++) {
var id = HEAP32[(((ids)+(i*4))>>2)];
var transformFeedback = GL.transformFeedbacks[id];
if (!transformFeedback) continue; // GL spec: "unused names in ids are ignored, as is the name zero."
GLctx['deleteTransformFeedback'](transformFeedback);
transformFeedback.name = 0;
GL.transformFeedbacks[id] = null;
}
}
function _glCheckFramebufferStatus(x0) { return GLctx['checkFramebufferStatus'](x0) }
function _gmtime_r(time, tmPtr) {
var date = new Date(HEAP32[((time)>>2)]*1000);
HEAP32[((tmPtr)>>2)]=date.getUTCSeconds();
HEAP32[(((tmPtr)+(4))>>2)]=date.getUTCMinutes();
HEAP32[(((tmPtr)+(8))>>2)]=date.getUTCHours();
HEAP32[(((tmPtr)+(12))>>2)]=date.getUTCDate();
HEAP32[(((tmPtr)+(16))>>2)]=date.getUTCMonth();
HEAP32[(((tmPtr)+(20))>>2)]=date.getUTCFullYear()-1900;
HEAP32[(((tmPtr)+(24))>>2)]=date.getUTCDay();
HEAP32[(((tmPtr)+(36))>>2)]=0;
HEAP32[(((tmPtr)+(32))>>2)]=0;
var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0);
var yday = ((date.getTime() - start) / (1000 * 60 * 60 * 24))|0;
HEAP32[(((tmPtr)+(28))>>2)]=yday;
HEAP32[(((tmPtr)+(40))>>2)]=___tm_timezone;
return tmPtr;
}function _gmtime(time) {
return _gmtime_r(time, ___tm_current);
}
function _glBindAttribLocation(program, index, name) {
name = Pointer_stringify(name);
GLctx.bindAttribLocation(GL.programs[program], index, name);
}
function _emscripten_glShaderBinary() {
GL.recordError(0x0500/*GL_INVALID_ENUM*/);
}
function _emscripten_glBlendColor(x0, x1, x2, x3) { GLctx['blendColor'](x0, x1, x2, x3) }
function _emscripten_glVertexAttrib2f(x0, x1, x2) { GLctx['vertexAttrib2f'](x0, x1, x2) }
function _emscripten_glUniform4fv(location, count, value) {
location = GL.uniforms[location];
var view;
if (4*count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[4*count-1];
for (var i = 0; i < 4*count; i += 4) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)];
view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)];
view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*16)>>2);
}
GLctx.uniform4fv(location, view);
}
function _glBufferSubData(target, offset, size, data) {
GLctx.bufferSubData(target, offset, HEAPU8.subarray(data, data+size));
}
function _glMapBufferRange() {
Module['printErr']('missing function: glMapBufferRange'); abort(-1);
}
function ___syscall40(which, varargs) {SYSCALLS.varargs = varargs;
try {
// rmdir
var path = SYSCALLS.getStr();
FS.rmdir(path);
return 0;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _emscripten_glBindTexture(target, texture) {
GLctx.bindTexture(target, texture ? GL.textures[texture] : null);
}
function _emscripten_glUniform1i(location, v0) {
location = GL.uniforms[location];
GLctx.uniform1i(location, v0);
}
function _emscripten_glVertexAttrib2fv(index, v) {
var view = GL.miniTempBufferViews[1];
view[0] = HEAPF32[v >> 2];
view[1] = HEAPF32[v + 4 >> 2];
GLctx.vertexAttrib2fv(index, view);
}
function _glGetShaderPrecisionFormat(shaderType, precisionType, range, precision) {
var result = GLctx.getShaderPrecisionFormat(shaderType, precisionType);
HEAP32[((range)>>2)]=result.rangeMin;
HEAP32[(((range)+(4))>>2)]=result.rangeMax;
HEAP32[((precision)>>2)]=result.precision;
}
Module["_roundf"] = _roundf;
function _emscripten_glDeleteObjectARB() {
Module['printErr']('missing function: emscripten_glDeleteObjectARB'); abort(-1);
}
function _emscripten_set_touchmove_callback(target, userData, useCapture, callbackfunc) {
JSEvents.registerTouchEventCallback(target, userData, useCapture, callbackfunc, 24, "touchmove");
return 0;
}
function _emscripten_glUniform1f(location, v0) {
location = GL.uniforms[location];
GLctx.uniform1f(location, v0);
}
function _emscripten_glVertexAttribPointer(index, size, type, normalized, stride, ptr) {
GLctx.vertexAttribPointer(index, size, type, !!normalized, stride, ptr);
}
function _glShaderSource(shader, count, string, length) {
var source = GL.getSource(shader, count, string, length);
GLctx.shaderSource(GL.shaders[shader], source);
}
function _pthread_create() {
return 11;
}
function _JS_WebRequest_Create(url, method)
{
var http = new XMLHttpRequest();
var _url = Pointer_stringify(url);
var _method = Pointer_stringify(method);
http.open(_method, _url, true);
http.responseType = 'arraybuffer';
wr.requestInstances[wr.nextRequestId] = http;
return wr.nextRequestId++;
}
function _emscripten_set_keypress_callback(target, userData, useCapture, callbackfunc) {
JSEvents.registerKeyEventCallback(target, userData, useCapture, callbackfunc, 1, "keypress");
return 0;
}
function _JS_SystemInfo_GetCurrentCanvasHeight()
{
return Module['canvas'].clientHeight;
}
var PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(key, destructor) {
if (key == 0) {
return ERRNO_CODES.EINVAL;
}
HEAP32[((key)>>2)]=PTHREAD_SPECIFIC_NEXT_KEY;
// values start at 0
PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY] = 0;
PTHREAD_SPECIFIC_NEXT_KEY++;
return 0;
}
function _glBeginQuery(target, id) {
GLctx['beginQuery'](target, id ? GL.queries[id] : null);
}
function _glGetUniformBlockIndex(program, uniformBlockName) {
program = GL.programs[program];
uniformBlockName = Pointer_stringify(uniformBlockName);
return GLctx['getUniformBlockIndex'](program, uniformBlockName);
}
function _glBindBuffer(target, buffer) {
var bufferObj = buffer ? GL.buffers[buffer] : null;
GLctx.bindBuffer(target, bufferObj);
}
function _pthread_mutexattr_destroy() {}
function ___syscall91(which, varargs) {SYSCALLS.varargs = varargs;
try {
// munmap
var addr = SYSCALLS.get(), len = SYSCALLS.get();
// TODO: support unmmap'ing parts of allocations
var info = SYSCALLS.mappings[addr];
if (!info) return 0;
if (len === info.len) {
var stream = FS.getStream(info.fd);
SYSCALLS.doMsync(addr, stream, len, info.flags)
FS.munmap(stream);
SYSCALLS.mappings[addr] = null;
if (info.allocated) {
_free(info.malloc);
}
}
return 0;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _pthread_cond_timedwait() { return 0; }
function _emscripten_glAttachShader(program, shader) {
GLctx.attachShader(GL.programs[program],
GL.shaders[shader]);
}
function _glGetProgramBinary(program, bufSize, length, binaryFormat, binary) {
GL.recordError(0x0502/*GL_INVALID_OPERATION*/);
}
function _glBufferData(target, size, data, usage) {
switch (usage) { // fix usages, WebGL only has *_DRAW
case 0x88E1: // GL_STREAM_READ
case 0x88E2: // GL_STREAM_COPY
usage = 0x88E0; // GL_STREAM_DRAW
break;
case 0x88E5: // GL_STATIC_READ
case 0x88E6: // GL_STATIC_COPY
usage = 0x88E4; // GL_STATIC_DRAW
break;
case 0x88E9: // GL_DYNAMIC_READ
case 0x88EA: // GL_DYNAMIC_COPY
usage = 0x88E8; // GL_DYNAMIC_DRAW
break;
}
if (!data) {
GLctx.bufferData(target, size, usage);
} else {
GLctx.bufferData(target, HEAPU8.subarray(data, data+size), usage);
}
}
function _sched_yield() {
return 0;
}
function _glGetError() {
// First return any GL error generated by the emscripten library_gl.js interop layer.
if (GL.lastError) {
var error = GL.lastError;
GL.lastError = 0/*GL_NO_ERROR*/;
return error;
} else { // If there were none, return the GL error from the browser GL context.
return GLctx.getError();
}
}
function _emscripten_glDrawBuffers(n, bufs) {
var bufArray = [];
for (var i = 0; i < n; i++)
bufArray.push(HEAP32[(((bufs)+(i*4))>>2)]);
GLctx['drawBuffers'](bufArray);
}
Module["_pthread_mutex_unlock"] = _pthread_mutex_unlock;
function _emscripten_glBindFramebuffer(target, framebuffer) {
GLctx.bindFramebuffer(target, framebuffer ? GL.framebuffers[framebuffer] : null);
}
function _emscripten_glBufferSubData(target, offset, size, data) {
GLctx.bufferSubData(target, offset, HEAPU8.subarray(data, data+size));
}
function _JS_Cursor_SetCursorString(cursor) {
try {
if (document.styleSheets.length == 0)
{
console.log ("can't set cursor because there is no style sheet.");
return;
}
var styleSheet = document.styleSheets[0];
var rule = 'canvas.emscripten { border: 0px none; cursor: '+cursor+'; }';
for (var i=0;i<styleSheet.cssRules.length;i++)
{
if (styleSheet.cssRules[i].cssText.indexOf ('canvas.emscripten') != -1)
{
styleSheet.deleteRule(i);
styleSheet.insertRule(rule, 0);
return;
}
}
styleSheet.insertRule(rule, 0);
}
catch (e)
{
// This can happen when using https and the stylesheet css is hosted
// on a non-CORS accessible location.
console.error ("Could not set cursor due to exception "+e);
}
}function _JS_Cursor_SetShow(show) {
var cursor = show?'default':'none';
_JS_Cursor_SetCursorString(cursor);
}
function _emscripten_set_keydown_callback(target, userData, useCapture, callbackfunc) {
JSEvents.registerKeyEventCallback(target, userData, useCapture, callbackfunc, 2, "keydown");
return 0;
}
Module["_sbrk"] = _sbrk;
function _glGetIntegerv(name_, p) {
emscriptenWebGLGet(name_, p, 'Integer');
}
function ___syscall85(which, varargs) {SYSCALLS.varargs = varargs;
try {
// readlink
var path = SYSCALLS.getStr(), buf = SYSCALLS.get(), bufsize = SYSCALLS.get();
return SYSCALLS.doReadlink(path, buf, bufsize);
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _glRenderbufferStorageMultisample(x0, x1, x2, x3, x4) { GLctx['renderbufferStorageMultisample'](x0, x1, x2, x3, x4) }
function _difftime(time1, time0) {
return time1 - time0;
}
function _glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels) {
var pixelData = null;
if (pixels) pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, internalFormat);
GLctx.texImage2D(target, level, internalFormat, width, height, border, format, type, pixelData);
}
function _glStencilMask(x0) { GLctx['stencilMask'](x0) }
function _pthread_mutexattr_settype() {}
function _glUniform1fv(location, count, value) {
location = GL.uniforms[location];
var view;
if (count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[count-1];
for (var i = 0; i < count; ++i) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*4)>>2);
}
GLctx.uniform1fv(location, view);
}
function _glGetShaderSource(shader, bufSize, length, source) {
var result = GLctx.getShaderSource(GL.shaders[shader]);
if (!result) return; // If an error occurs, nothing will be written to length or source.
if (bufSize > 0 && source) {
var numBytesWrittenExclNull = stringToUTF8(result, source, bufSize);
if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull;
} else {
if (length) HEAP32[((length)>>2)]=0;
}
}
function _JS_Cursor_SetImage(ptr, length) {
var binary = ''
for (var i = 0; i < length; i++) {
binary += String.fromCharCode( HEAPU8[ ptr+i ] )
}
var base64 = btoa( binary );
var cursor = "url(data:image/cur;base64,"+base64+"),default";
_JS_Cursor_SetCursorString(cursor);
}
function ___unlock() {}
function _JS_WebRequest_Release(request)
{
var http = wr.requestInstances[request];
http.onload = null;
http.onerror = null;
http.ontimeout = null;
http.onabort = null;
delete http;
wr.requestInstances[request] = null;
}
function _setenv(envname, envval, overwrite) {
// int setenv(const char *envname, const char *envval, int overwrite);
// http://pubs.opengroup.org/onlinepubs/009695399/functions/setenv.html
if (envname === 0) {
___setErrNo(ERRNO_CODES.EINVAL);
return -1;
}
var name = Pointer_stringify(envname);
var val = Pointer_stringify(envval);
if (name === '' || name.indexOf('=') !== -1) {
___setErrNo(ERRNO_CODES.EINVAL);
return -1;
}
if (ENV.hasOwnProperty(name) && !overwrite) return 0;
ENV[name] = val;
___buildEnvironment(ENV);
return 0;
}
function ___cxa_allocate_exception(size) {
return _malloc(size);
}
function _emscripten_glGetProgramiv(program, pname, p) {
if (!p) {
// GLES2 specification does not specify how to behave if p is a null pointer. Since calling this function does not make sense
// if p == null, issue a GL error to notify user about it.
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
if (program >= GL.counter) {
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
return;
}
var ptable = GL.programInfos[program];
if (!ptable) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
return;
}
if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH
var log = GLctx.getProgramInfoLog(GL.programs[program]);
if (log === null) log = '(unknown error)';
HEAP32[((p)>>2)]=log.length + 1;
} else if (pname == 0x8B87 /* GL_ACTIVE_UNIFORM_MAX_LENGTH */) {
HEAP32[((p)>>2)]=ptable.maxUniformLength;
} else if (pname == 0x8B8A /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */) {
if (ptable.maxAttributeLength == -1) {
var program = GL.programs[program];
var numAttribs = GLctx.getProgramParameter(program, GLctx.ACTIVE_ATTRIBUTES);
ptable.maxAttributeLength = 0; // Spec says if there are no active attribs, 0 must be returned.
for (var i = 0; i < numAttribs; ++i) {
var activeAttrib = GLctx.getActiveAttrib(program, i);
ptable.maxAttributeLength = Math.max(ptable.maxAttributeLength, activeAttrib.name.length+1);
}
}
HEAP32[((p)>>2)]=ptable.maxAttributeLength;
} else if (pname == 0x8A35 /* GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */) {
if (ptable.maxUniformBlockNameLength == -1) {
var program = GL.programs[program];
var numBlocks = GLctx.getProgramParameter(program, GLctx.ACTIVE_UNIFORM_BLOCKS);
ptable.maxUniformBlockNameLength = 0;
for (var i = 0; i < numBlocks; ++i) {
var activeBlockName = GLctx.getActiveUniformBlockName(program, i);
ptable.maxUniformBlockNameLength = Math.max(ptable.maxUniformBlockNameLength, activeBlockName.length+1);
}
}
HEAP32[((p)>>2)]=ptable.maxUniformBlockNameLength;
} else {
HEAP32[((p)>>2)]=GLctx.getProgramParameter(GL.programs[program], pname);
}
}
function _emscripten_glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels) {
var pixelData = null;
if (pixels) pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, internalFormat);
GLctx.texImage2D(target, level, internalFormat, width, height, border, format, type, pixelData);
}
function _emscripten_glGenVertexArrays(n, arrays) {
for (var i = 0; i < n; i++) {
var vao = GLctx['createVertexArray']();
if (!vao) {
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
while(i < n) HEAP32[(((arrays)+(i++*4))>>2)]=0;
return;
}
var id = GL.getNewId(GL.vaos);
vao.name = id;
GL.vaos[id] = vao;
HEAP32[(((arrays)+(i*4))>>2)]=id;
}
}
function _glFlushMappedBufferRange() {
Module['printErr']('missing function: glFlushMappedBufferRange'); abort(-1);
}
function _glCopyBufferSubData(x0, x1, x2, x3, x4) { GLctx['copyBufferSubData'](x0, x1, x2, x3, x4) }
function ___syscall183(which, varargs) {SYSCALLS.varargs = varargs;
try {
// getcwd
var buf = SYSCALLS.get(), size = SYSCALLS.get();
if (size === 0) return -ERRNO_CODES.EINVAL;
var cwd = FS.cwd();
if (size < cwd.length + 1) return -ERRNO_CODES.ERANGE;
writeAsciiToMemory(cwd, buf);
return buf;
} catch (e) {
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
return -e.errno;
}
}
function _glDepthMask(flag) {
GLctx.depthMask(!!flag);
}
function _glUniformMatrix4fv(location, count, transpose, value) {
location = GL.uniforms[location];
var view;
if (16*count <= GL.MINI_TEMP_BUFFER_SIZE) {
// avoid allocation when uploading few enough uniforms
view = GL.miniTempBufferViews[16*count-1];
for (var i = 0; i < 16*count; i += 16) {
view[i] = HEAPF32[(((value)+(4*i))>>2)];
view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)];
view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)];
view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)];
view[i+4] = HEAPF32[(((value)+(4*i+16))>>2)];
view[i+5] = HEAPF32[(((value)+(4*i+20))>>2)];
view[i+6] = HEAPF32[(((value)+(4*i+24))>>2)];
view[i+7] = HEAPF32[(((value)+(4*i+28))>>2)];
view[i+8] = HEAPF32[(((value)+(4*i+32))>>2)];
view[i+9] = HEAPF32[(((value)+(4*i+36))>>2)];
view[i+10] = HEAPF32[(((value)+(4*i+40))>>2)];
view[i+11] = HEAPF32[(((value)+(4*i+44))>>2)];
view[i+12] = HEAPF32[(((value)+(4*i+48))>>2)];
view[i+13] = HEAPF32[(((value)+(4*i+52))>>2)];
view[i+14] = HEAPF32[(((value)+(4*i+56))>>2)];
view[i+15] = HEAPF32[(((value)+(4*i+60))>>2)];
}
} else {
view = HEAPF32.subarray((value)>>2,(value+count*64)>>2);
}
GLctx.uniformMatrix4fv(location, !!transpose, view);
}
function _emscripten_glClientActiveTexture() {
Module['printErr']('missing function: emscripten_glClientActiveTexture'); abort(-1);
}
function _glGetActiveUniform(program, index, bufSize, length, size, type, name) {
program = GL.programs[program];
var info = GLctx.getActiveUniform(program, index);
if (!info) return; // If an error occurs, nothing will be written to length, size, type and name.
if (bufSize > 0 && name) {
var numBytesWrittenExclNull = stringToUTF8(info.name, name, bufSize);
if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull;
} else {
if (length) HEAP32[((length)>>2)]=0;
}
if (size) HEAP32[((size)>>2)]=info.size;
if (type) HEAP32[((type)>>2)]=info.type;
}
function _emscripten_glValidateProgram(program) {
GLctx.validateProgram(GL.programs[program]);
}
function _emscripten_get_main_loop_timing(mode, value) {
if (mode) HEAP32[((mode)>>2)]=Browser.mainLoop.timingMode;
if (value) HEAP32[((value)>>2)]=Browser.mainLoop.timingValue;
}
function _glFrontFace(x0) { GLctx['frontFace'](x0) }
function _emscripten_webgl_get_current_context() {
return GL.currentContext ? GL.currentContext.handle : 0;
}
function _emscripten_glPixelStorei(pname, param) {
if (pname == 0x0D05 /* GL_PACK_ALIGNMENT */) {
GL.packAlignment = param;
} else if (pname == 0x0cf5 /* GL_UNPACK_ALIGNMENT */) {
GL.unpackAlignment = param;
}
GLctx.pixelStorei(pname, param);
}
function _emscripten_glDeleteTextures(n, textures) {
for (var i = 0; i < n; i++) {
var id = HEAP32[(((textures)+(i*4))>>2)];
var texture = GL.textures[id];
if (!texture) continue; // GL spec: "glDeleteTextures silently ignores 0s and names that do not correspond to existing textures".
GLctx.deleteTexture(texture);
texture.name = 0;
GL.textures[id] = null;
}
}
function _glGetString(name_) {
if (GL.stringCache[name_]) return GL.stringCache[name_];
var ret;
switch(name_) {
case 0x1F00 /* GL_VENDOR */:
case 0x1F01 /* GL_RENDERER */:
case 0x9245 /* UNMASKED_VENDOR_WEBGL */:
case 0x9246 /* UNMASKED_RENDERER_WEBGL */:
ret = allocate(intArrayFromString(GLctx.getParameter(name_)), 'i8', ALLOC_NORMAL);
break;
case 0x1F02 /* GL_VERSION */:
var glVersion = GLctx.getParameter(GLctx.VERSION);
// return GLES version string corresponding to the version of the WebGL context
if (GLctx.canvas.GLctxObject.version >= 2) glVersion = 'OpenGL ES 3.0 (' + glVersion + ')';
else
{
glVersion = 'OpenGL ES 2.0 (' + glVersion + ')';
}
ret = allocate(intArrayFromString(glVersion), 'i8', ALLOC_NORMAL);
break;
case 0x1F03 /* GL_EXTENSIONS */:
var exts = GLctx.getSupportedExtensions();
var gl_exts = [];
for (var i in exts) {
gl_exts.push(exts[i]);
gl_exts.push("GL_" + exts[i]);
}
ret = allocate(intArrayFromString(gl_exts.join(' ')), 'i8', ALLOC_NORMAL);
break;
case 0x8B8C /* GL_SHADING_LANGUAGE_VERSION */:
var glslVersion = GLctx.getParameter(GLctx.SHADING_LANGUAGE_VERSION);
// extract the version number 'N.M' from the string 'WebGL GLSL ES N.M ...'
var ver_re = /^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;
var ver_num = glslVersion.match(ver_re);
if (ver_num !== null) {
if (ver_num[1].length == 3) ver_num[1] = ver_num[1] + '0'; // ensure minor version has 2 digits
glslVersion = 'OpenGL ES GLSL ES ' + ver_num[1] + ' (' + glslVersion + ')';
}
ret = allocate(intArrayFromString(glslVersion), 'i8', ALLOC_NORMAL);
break;
default:
GL.recordError(0x0500/*GL_INVALID_ENUM*/);
return 0;
}
GL.stringCache[name_] = ret;
return ret;
}
var _llvm_nacl_atomic_cmpxchg_i32=undefined;
Module["_llvm_bswap_i16"] = _llvm_bswap_i16;
function _time(ptr) {
var ret = (Date.now()/1000)|0;
if (ptr) {
HEAP32[((ptr)>>2)]=ret;
}
return ret;
}
Module["_pthread_self"] = _pthread_self;
function _emscripten_glGetBooleanv(name_, p) {
emscriptenWebGLGet(name_, p, 'Boolean');
}
function _emscripten_glCompileShader(shader) {
GLctx.compileShader(GL.shaders[shader]);
}
var GLctx; GL.init();
Module["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas, vrDevice) { Module.printErr("Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead."); Module["requestFullScreen"] = Module["requestFullscreen"]; Browser.requestFullScreen(lockPointer, resizeCanvas, vrDevice) };
Module["requestFullscreen"] = function Module_requestFullscreen(lockPointer, resizeCanvas, vrDevice) { Browser.requestFullscreen(lockPointer, resizeCanvas, vrDevice) };
Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };
Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };
Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };
Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };
Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia() }
Module["createContext"] = function Module_createContext(canvas, useWebGL, setInModule, webGLContextAttributes) { return Browser.createContext(canvas, useWebGL, setInModule, webGLContextAttributes) };
if (ENVIRONMENT_IS_NODE) {
_emscripten_get_now = function _emscripten_get_now_actual() {
var t = process['hrtime']();
return t[0] * 1e3 + t[1] / 1e6;
};
} else if (typeof dateNow !== 'undefined') {
_emscripten_get_now = dateNow;
} else if (typeof self === 'object' && self['performance'] && typeof self['performance']['now'] === 'function') {
_emscripten_get_now = function() { return self['performance']['now'](); };
} else if (typeof performance === 'object' && typeof performance['now'] === 'function') {
_emscripten_get_now = function() { return performance['now'](); };
} else {
_emscripten_get_now = Date.now;
};
FS.staticInit();__ATINIT__.unshift(function() { if (!Module["noFSInit"] && !FS.init.initialized) FS.init() });__ATMAIN__.push(function() { FS.ignorePermissions = false });__ATEXIT__.push(function() { FS.quit() });Module["FS_createFolder"] = FS.createFolder;Module["FS_createPath"] = FS.createPath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloadedFile"] = FS.createPreloadedFile;Module["FS_createLazyFile"] = FS.createLazyFile;Module["FS_createLink"] = FS.createLink;Module["FS_createDevice"] = FS.createDevice;Module["FS_unlink"] = FS.unlink;;
__ATINIT__.unshift(function() { TTY.init() });__ATEXIT__.push(function() { TTY.shutdown() });;
if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); var NODEJS_PATH = require("path"); NODEFS.staticInit(); };
___buildEnvironment(ENV);;
DYNAMICTOP_PTR = allocate(1, "i32", ALLOC_STATIC);
STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);
STACK_MAX = STACK_BASE + TOTAL_STACK;
DYNAMIC_BASE = Runtime.alignMemory(STACK_MAX);
HEAP32[DYNAMICTOP_PTR>>2] = DYNAMIC_BASE;
staticSealed = true; // seal the static portion of memory
Module['wasmTableSize'] = 42924;
Module['wasmMaxTableSize'] = 42924;
function invoke_viiifiii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
Module["dynCall_viiifiii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_diji(index,a1,a2,a3,a4) {
try {
return Module["dynCall_diji"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_diddi(index,a1,a2,a3,a4) {
try {
return Module["dynCall_diddi"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viij(index,a1,a2,a3,a4) {
try {
Module["dynCall_viij"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiff(index,a1,a2,a3) {
try {
return Module["dynCall_fiff"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fifi(index,a1,a2,a3) {
try {
return Module["dynCall_fifi"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vijjiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) {
try {
Module["dynCall_vijjiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6) {
try {
return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vidi(index,a1,a2,a3) {
try {
Module["dynCall_vidi"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vifiiiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20) {
try {
Module["dynCall_vifiiiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) {
try {
Module["dynCall_viiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fff(index,a1,a2) {
try {
return Module["dynCall_fff"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iidi(index,a1,a2,a3) {
try {
return Module["dynCall_iidi"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viffffiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {
try {
Module["dynCall_viffffiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jiji(index,a1,a2,a3,a4) {
try {
return Module["dynCall_jiji"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiiiiiifiiiiiif(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) {
try {
return Module["dynCall_fiiiiiifiiiiiif"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiifiiiif(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) {
try {
return Module["dynCall_iiiiifiiiif"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiifii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
return Module["dynCall_iiiiifii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiffi(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
Module["dynCall_viiiiiffi"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viifiiii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
Module["dynCall_viifiiii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiijiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
Module["dynCall_viiijiii"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiifiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
return Module["dynCall_iiiiifiii"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiffi(index,a1,a2,a3,a4) {
try {
return Module["dynCall_iiffi"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jii(index,a1,a2) {
try {
return Module["dynCall_jii"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) {
try {
return Module["dynCall_iiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fif(index,a1,a2) {
try {
return Module["dynCall_fif"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) {
try {
Module["dynCall_viiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fii(index,a1,a2) {
try {
return Module["dynCall_fii"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiifiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) {
try {
Module["dynCall_viiiiiifiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiifii(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
Module["dynCall_viiiiifii"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_di(index,a1) {
try {
return Module["dynCall_di"](index,a1);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viff(index,a1,a2,a3) {
try {
Module["dynCall_viff"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiifiii(index,a1,a2,a3,a4,a5,a6) {
try {
return Module["dynCall_iiifiii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiifi(index,a1,a2,a3,a4,a5,a6,a7) {
try {
Module["dynCall_viiiiifi"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viffff(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_viffff"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jijji(index,a1,a2,a3,a4,a5,a6) {
try {
return Module["dynCall_jijji"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vfff(index,a1,a2,a3) {
try {
Module["dynCall_vfff"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiji(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_viiji"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vififfi(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_vififfi"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiijiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) {
try {
Module["dynCall_viiiiijiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiijjii(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
return Module["dynCall_iiijjii"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiffiii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
Module["dynCall_viiffiii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_dii(index,a1,a2) {
try {
return Module["dynCall_dii"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viififfii(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
Module["dynCall_viififfii"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iifii(index,a1,a2,a3,a4) {
try {
return Module["dynCall_iifii"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_didi(index,a1,a2,a3) {
try {
return Module["dynCall_didi"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {
try {
return Module["dynCall_iiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iidii(index,a1,a2,a3,a4) {
try {
return Module["dynCall_iidii"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiij(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_iiiij"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiiiiiiiffffii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17) {
try {
return Module["dynCall_iiiiiiiiiiiiffffii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vdd(index,a1,a2) {
try {
Module["dynCall_vdd"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiiifii(index,a1,a2,a3,a4,a5,a6) {
try {
return Module["dynCall_fiiifii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiiffii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) {
try {
Module["dynCall_viiiiiiffii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viffii(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_viffii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
return Module["dynCall_iiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vffff(index,a1,a2,a3,a4) {
try {
Module["dynCall_vffff"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iijjii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
return Module["dynCall_iijjii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vdddddd(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_vdddddd"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vifiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) {
try {
Module["dynCall_vifiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiji(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_iiiji"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34) {
try {
Module["dynCall_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiifii(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viiifii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiif(index,a1,a2,a3,a4,a5,a6,a7) {
try {
return Module["dynCall_iiiiiiif"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vififi(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_vififi"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_ijj(index,a1,a2,a3,a4) {
try {
return Module["dynCall_ijj"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiffi(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viiiffi"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiii(index,a1,a2,a3,a4) {
try {
return Module["dynCall_iiiii"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiffi(index,a1,a2,a3,a4) {
try {
return Module["dynCall_fiffi"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiifii(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_iiifii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17) {
try {
Module["dynCall_viiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jiijiii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
return Module["dynCall_jiijiii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13) {
try {
return Module["dynCall_iiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jijjji(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
return Module["dynCall_jijjji"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vifiiiiiiiiiiiiiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30) {
try {
Module["dynCall_vifiiiiiiiiiiiiiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viffi(index,a1,a2,a3,a4) {
try {
Module["dynCall_viffi"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiifiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
return Module["dynCall_iiiifiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vifi(index,a1,a2,a3) {
try {
Module["dynCall_vifi"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viijj(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viijj"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vifff(index,a1,a2,a3,a4) {
try {
Module["dynCall_vifff"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) {
try {
Module["dynCall_viiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiii(index,a1,a2,a3) {
try {
return Module["dynCall_fiii"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiifffiiifii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) {
try {
return Module["dynCall_iiiiiifffiiifii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iifff(index,a1,a2,a3,a4) {
try {
return Module["dynCall_iifff"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iifiii(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_iifiii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiif(index,a1,a2,a3) {
try {
return Module["dynCall_fiif"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiijii(index,a1,a2,a3,a4,a5,a6) {
try {
return Module["dynCall_iiijii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiifiif(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
return Module["dynCall_iiiiifiif"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jidi(index,a1,a2,a3) {
try {
return Module["dynCall_jidi"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_ji(index,a1) {
try {
return Module["dynCall_ji"](index,a1);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vifiiiii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
Module["dynCall_vifiiiii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) {
try {
Module["dynCall_viiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiffiiiiiiiiiffffiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23) {
try {
return Module["dynCall_iiiiiiffiiiiiiiiiffffiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_diii(index,a1,a2,a3) {
try {
return Module["dynCall_diii"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiji(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viiiji"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiffifi(index,a1,a2,a3,a4,a5,a6) {
try {
return Module["dynCall_fiffifi"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vff(index,a1,a2) {
try {
Module["dynCall_vff"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viijijiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) {
try {
Module["dynCall_viijijiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viijijji(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) {
try {
Module["dynCall_viijijji"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiififi(index,a1,a2,a3,a4,a5,a6,a7) {
try {
Module["dynCall_viiififi"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiiii(index,a1,a2,a3,a4) {
try {
return Module["dynCall_fiiii"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiii(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiifii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
Module["dynCall_viiiifii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vijii(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_vijii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jidji(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_jidji"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viidii(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_viidii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vjji(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_vjji"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiifiif(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {
try {
return Module["dynCall_iiiiiifiif"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiii(index,a1,a2,a3,a4) {
try {
Module["dynCall_viiii"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jijii(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_jijii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiii(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viifii(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_viifii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iifffi(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_iifffi"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vif(index,a1,a2) {
try {
Module["dynCall_vif"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vid(index,a1,a2) {
try {
Module["dynCall_vid"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vij(index,a1,a2,a3) {
try {
Module["dynCall_vij"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vii(index,a1,a2) {
try {
Module["dynCall_vii"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vijji(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_vijji"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiifiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
Module["dynCall_viiiifiii"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_difi(index,a1,a2,a3) {
try {
return Module["dynCall_difi"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fi(index,a1) {
try {
return Module["dynCall_fi"](index,a1);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viidi(index,a1,a2,a3,a4) {
try {
Module["dynCall_viidi"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viifif(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_viifif"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiji(index,a1,a2,a3,a4) {
try {
return Module["dynCall_fiji"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jiiiiiii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
return Module["dynCall_jiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vf(index,a1) {
try {
Module["dynCall_vf"](index,a1);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiffiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22) {
try {
return Module["dynCall_iiiiiiffiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiiiiiiiifiiiif(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) {
try {
return Module["dynCall_fiiiiiiiifiiiif"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viffffii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
Module["dynCall_viffffii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vifiii(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_vifiii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viijjii(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
Module["dynCall_viijjii"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iijjji(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
return Module["dynCall_iijjji"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_diiii(index,a1,a2,a3,a4) {
try {
return Module["dynCall_diiii"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiifiiii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
return Module["dynCall_iiifiiii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13) {
try {
Module["dynCall_viiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiiiiiffffii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) {
try {
return Module["dynCall_iiiiiiiiiiffffii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiifi(index,a1,a2,a3,a4,a5,a6) {
try {
return Module["dynCall_iiiiifi"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fifii(index,a1,a2,a3,a4) {
try {
return Module["dynCall_fifii"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viji(index,a1,a2,a3,a4) {
try {
Module["dynCall_viji"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
Module["dynCall_viiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiffifffi(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
return Module["dynCall_fiffifffi"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiff(index,a1,a2,a3,a4) {
try {
Module["dynCall_viiff"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iif(index,a1,a2) {
try {
return Module["dynCall_iif"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vifiiii(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_vifiiii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
Module["dynCall_viiiiiii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vijiji(index,a1,a2,a3,a4,a5,a6,a7) {
try {
Module["dynCall_vijiji"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vifii(index,a1,a2,a3,a4) {
try {
Module["dynCall_vifii"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {
try {
Module["dynCall_viiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viijji(index,a1,a2,a3,a4,a5,a6,a7) {
try {
Module["dynCall_viijji"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iii(index,a1,a2) {
try {
return Module["dynCall_iii"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viifiii(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viifiii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iij(index,a1,a2,a3) {
try {
return Module["dynCall_iij"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiijiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) {
try {
Module["dynCall_viiijiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiifii(index,a1,a2,a3,a4,a5,a6) {
try {
return Module["dynCall_iiiifii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiffii(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viiffii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_f(index) {
try {
return Module["dynCall_f"](index);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jiiii(index,a1,a2,a3,a4) {
try {
return Module["dynCall_jiiii"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viijii(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viijii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiifiiiiif(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) {
try {
Module["dynCall_viiiifiiiiif"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viififi(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viififi"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viii(index,a1,a2,a3) {
try {
Module["dynCall_viii"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiifi(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viiiifi"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jiii(index,a1,a2,a3) {
try {
return Module["dynCall_jiii"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiji(index,a1,a2,a3,a4) {
try {
return Module["dynCall_iiji"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viif(index,a1,a2,a3) {
try {
Module["dynCall_viif"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vijiii(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_vijiii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiiifi(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_fiiifi"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiifi(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_iiiifi"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_v(index) {
try {
Module["dynCall_v"](index);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vd(index,a1) {
try {
Module["dynCall_vd"](index,a1);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viifi(index,a1,a2,a3,a4) {
try {
Module["dynCall_viifi"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiifi(index,a1,a2,a3,a4) {
try {
return Module["dynCall_fiifi"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vi(index,a1) {
try {
Module["dynCall_vi"](index,a1);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) {
try {
return Module["dynCall_iiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiiffiiiiiiiiiffffiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25) {
try {
return Module["dynCall_iiiiiiiffiiiiiiiiiffffiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vijj(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_vijj"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_ii(index,a1) {
try {
return Module["dynCall_ii"](index,a1);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vifffi(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_vifffi"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iijji(index,a1,a2,a3,a4,a5,a6) {
try {
return Module["dynCall_iijji"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiifiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) {
try {
return Module["dynCall_iiiiifiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiifiiiiif(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) {
try {
return Module["dynCall_iiiiifiiiiif"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jifi(index,a1,a2,a3) {
try {
return Module["dynCall_jifi"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) {
try {
Module["dynCall_viiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iifi(index,a1,a2,a3) {
try {
return Module["dynCall_iifi"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiif(index,a1,a2,a3,a4) {
try {
Module["dynCall_viiif"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fifffi(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_fifffi"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_jiiiii(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_jiiiii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vifiiiiiiiiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25) {
try {
Module["dynCall_vifiiiiiiiiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiffii(index,a1,a2,a3,a4,a5,a6) {
try {
return Module["dynCall_iiiffii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vijiijiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) {
try {
Module["dynCall_vijiijiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiifi(index,a1,a2,a3,a4) {
try {
return Module["dynCall_iiifi"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiii(index,a1,a2,a3) {
try {
return Module["dynCall_iiii"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fidi(index,a1,a2,a3) {
try {
return Module["dynCall_fidi"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiij(index,a1,a2,a3,a4) {
try {
return Module["dynCall_iiij"](index,a1,a2,a3,a4);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viifff(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_viifff"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiffi(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_viiffi"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiif(index,a1,a2,a3) {
try {
return Module["dynCall_iiif"](index,a1,a2,a3);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viffiii(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viffiii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_diiiii(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_diiiii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiifi(index,a1,a2,a3,a4,a5) {
try {
Module["dynCall_viiifi"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_fiiffi(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_fiiffi"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiffiiiiiiiiiffffiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24) {
try {
return Module["dynCall_iiiiiiffiiiiiiiiiffffiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) {
try {
return Module["dynCall_iiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viifffi(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viifffi"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vifffii(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_vifffii"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiifiii(index,a1,a2,a3,a4,a5,a6,a7) {
try {
return Module["dynCall_iiiifiii"](index,a1,a2,a3,a4,a5,a6,a7);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_ff(index,a1) {
try {
return Module["dynCall_ff"](index,a1);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiifiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {
try {
return Module["dynCall_iiiifiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iijii(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_iijii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) {
try {
return Module["dynCall_iiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_vfi(index,a1,a2) {
try {
Module["dynCall_vfi"](index,a1,a2);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_i(index) {
try {
return Module["dynCall_i"](index);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiidii(index,a1,a2,a3,a4,a5) {
try {
return Module["dynCall_iiidii"](index,a1,a2,a3,a4,a5);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiifiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {
try {
Module["dynCall_viiifiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viiiiifffi(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {
try {
Module["dynCall_viiiiifffi"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiijii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {
try {
return Module["dynCall_iiiiiijii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viijjji(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {
try {
Module["dynCall_viijjji"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {
try {
return Module["dynCall_iiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
function invoke_viffffi(index,a1,a2,a3,a4,a5,a6) {
try {
Module["dynCall_viffffi"](index,a1,a2,a3,a4,a5,a6);
} catch(e) {
if (typeof e !== 'number' && e !== 'longjmp') throw e;
asm["setThrew"](1, 0);
}
}
Module.asmGlobalArg = { "Math": Math, "Int8Array": Int8Array, "Int16Array": Int16Array, "Int32Array": Int32Array, "Uint8Array": Uint8Array, "Uint16Array": Uint16Array, "Uint32Array": Uint32Array, "Float32Array": Float32Array, "Float64Array": Float64Array, "NaN": NaN, "Infinity": Infinity };
Module.asmLibraryArg = { "abort": abort, "assert": assert, "enlargeMemory": enlargeMemory, "getTotalMemory": getTotalMemory, "abortOnCannotGrowMemory": abortOnCannotGrowMemory, "invoke_viiifiii": invoke_viiifiii, "invoke_diji": invoke_diji, "invoke_diddi": invoke_diddi, "invoke_viij": invoke_viij, "invoke_fiff": invoke_fiff, "invoke_fifi": invoke_fifi, "invoke_vijjiiiiii": invoke_vijjiiiiii, "invoke_iiiiiii": invoke_iiiiiii, "invoke_vidi": invoke_vidi, "invoke_vifiiiiiiiiiiiiiiiiii": invoke_vifiiiiiiiiiiiiiiiiii, "invoke_viiiiiiiiiii": invoke_viiiiiiiiiii, "invoke_fff": invoke_fff, "invoke_iidi": invoke_iidi, "invoke_viffffiiii": invoke_viffffiiii, "invoke_jiji": invoke_jiji, "invoke_fiiiiiifiiiiiif": invoke_fiiiiiifiiiiiif, "invoke_iiiiifiiiif": invoke_iiiiifiiiif, "invoke_iiiiifii": invoke_iiiiifii, "invoke_viiiiiffi": invoke_viiiiiffi, "invoke_viifiiii": invoke_viifiiii, "invoke_viiijiii": invoke_viiijiii, "invoke_iiiiifiii": invoke_iiiiifiii, "invoke_iiffi": invoke_iiffi, "invoke_jii": invoke_jii, "invoke_iiiiiiiiiiii": invoke_iiiiiiiiiiii, "invoke_fif": invoke_fif, "invoke_viiiiiiiiiiiiiii": invoke_viiiiiiiiiiiiiii, "invoke_fii": invoke_fii, "invoke_viiiiiifiii": invoke_viiiiiifiii, "invoke_viiiiifii": invoke_viiiiifii, "invoke_di": invoke_di, "invoke_viff": invoke_viff, "invoke_iiifiii": invoke_iiifiii, "invoke_viiiiifi": invoke_viiiiifi, "invoke_viffff": invoke_viffff, "invoke_jijji": invoke_jijji, "invoke_vfff": invoke_vfff, "invoke_viiji": invoke_viiji, "invoke_vififfi": invoke_vififfi, "invoke_viiiiijiiii": invoke_viiiiijiiii, "invoke_iiijjii": invoke_iiijjii, "invoke_viiffiii": invoke_viiffiii, "invoke_dii": invoke_dii, "invoke_viififfii": invoke_viififfii, "invoke_iifii": invoke_iifii, "invoke_didi": invoke_didi, "invoke_iiiiiiiiii": invoke_iiiiiiiiii, "invoke_iidii": invoke_iidii, "invoke_iiiij": invoke_iiiij, "invoke_iiiiiiiiiiiiffffii": invoke_iiiiiiiiiiiiffffii, "invoke_vdd": invoke_vdd, "invoke_fiiifii": invoke_fiiifii, "invoke_viiiiiiffii": invoke_viiiiiiffii, "invoke_viffii": invoke_viffii, "invoke_iiiiiiii": invoke_iiiiiiii, "invoke_vffff": invoke_vffff, "invoke_iijjii": invoke_iijjii, "invoke_vdddddd": invoke_vdddddd, "invoke_vifiiiiiiiiiiiii": invoke_vifiiiiiiiiiiiii, "invoke_iiiji": invoke_iiiji, "invoke_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii": invoke_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii, "invoke_viiifii": invoke_viiifii, "invoke_iiiiiiif": invoke_iiiiiiif, "invoke_vififi": invoke_vififi, "invoke_ijj": invoke_ijj, "invoke_viiiffi": invoke_viiiffi, "invoke_iiiii": invoke_iiiii, "invoke_fiffi": invoke_fiffi, "invoke_iiifii": invoke_iiifii, "invoke_viiiiiiiiiiiiiiiii": invoke_viiiiiiiiiiiiiiiii, "invoke_jiijiii": invoke_jiijiii, "invoke_iiiiiiiiiiiiii": invoke_iiiiiiiiiiiiii, "invoke_jijjji": invoke_jijjji, "invoke_vifiiiiiiiiiiiiiiiiiiiiiiiiiiii": invoke_vifiiiiiiiiiiiiiiiiiiiiiiiiiiii, "invoke_viffi": invoke_viffi, "invoke_iiiifiiii": invoke_iiiifiiii, "invoke_vifi": invoke_vifi, "invoke_viijj": invoke_viijj, "invoke_vifff": invoke_vifff, "invoke_viiiiii": invoke_viiiiii, "invoke_viiiiiiiiiiiiii": invoke_viiiiiiiiiiiiii, "invoke_fiii": invoke_fiii, "invoke_iiiiiifffiiifii": invoke_iiiiiifffiiifii, "invoke_iifff": invoke_iifff, "invoke_iifiii": invoke_iifiii, "invoke_fiif": invoke_fiif, "invoke_iiijii": invoke_iiijii, "invoke_iiiiifiif": invoke_iiiiifiif, "invoke_jidi": invoke_jidi, "invoke_ji": invoke_ji, "invoke_vifiiiii": invoke_vifiiiii, "invoke_viiiiiiiiii": invoke_viiiiiiiiii, "invoke_iiiiiiffiiiiiiiiiffffiii": invoke_iiiiiiffiiiiiiiiiffffiii, "invoke_diii": invoke_diii, "invoke_viiiji": invoke_viiiji, "invoke_fiffifi": invoke_fiffifi, "invoke_vff": invoke_vff, "invoke_viijijiii": invoke_viijijiii, "invoke_viijijji": invoke_viijijji, "invoke_viiififi": invoke_viiififi, "invoke_fiiii": invoke_fiiii, "invoke_iiiiii": invoke_iiiiii, "invoke_viiiifii": invoke_viiiifii, "invoke_vijii": invoke_vijii, "invoke_jidji": invoke_jidji, "invoke_viidii": invoke_viidii, "invoke_vjji": invoke_vjji, "invoke_iiiiiifiif": invoke_iiiiiifiif, "invoke_viiii": invoke_viiii, "invoke_jijii": invoke_jijii, "invoke_viiiii": invoke_viiiii, "invoke_viifii": invoke_viifii, "invoke_iifffi": invoke_iifffi, "invoke_vif": invoke_vif, "invoke_vid": invoke_vid, "invoke_vij": invoke_vij, "invoke_vii": invoke_vii, "invoke_vijji": invoke_vijji, "invoke_viiiifiii": invoke_viiiifiii, "invoke_difi": invoke_difi, "invoke_fi": invoke_fi, "invoke_viidi": invoke_viidi, "invoke_viifif": invoke_viifif, "invoke_fiji": invoke_fiji, "invoke_jiiiiiii": invoke_jiiiiiii, "invoke_vf": invoke_vf, "invoke_iiiiiiffiiiiiiiiiiiiiii": invoke_iiiiiiffiiiiiiiiiiiiiii, "invoke_fiiiiiiiifiiiif": invoke_fiiiiiiiifiiiif, "invoke_viffffii": invoke_viffffii, "invoke_vifiii": invoke_vifiii, "invoke_viijjii": invoke_viijjii, "invoke_iijjji": invoke_iijjji, "invoke_diiii": invoke_diiii, "invoke_iiifiiii": invoke_iiifiiii, "invoke_viiiiiiiiiiiii": invoke_viiiiiiiiiiiii, "invoke_iiiiiiiiiiffffii": invoke_iiiiiiiiiiffffii, "invoke_iiiiifi": invoke_iiiiifi, "invoke_fifii": invoke_fifii, "invoke_viji": invoke_viji, "invoke_viiiiiiii": invoke_viiiiiiii, "invoke_fiffifffi": invoke_fiffifffi, "invoke_viiff": invoke_viiff, "invoke_iif": invoke_iif, "invoke_vifiiii": invoke_vifiiii, "invoke_viiiiiii": invoke_viiiiiii, "invoke_vijiji": invoke_vijiji, "invoke_vifii": invoke_vifii, "invoke_viiiiiiiii": invoke_viiiiiiiii, "invoke_viijji": invoke_viijji, "invoke_iii": invoke_iii, "invoke_viifiii": invoke_viifiii, "invoke_iij": invoke_iij, "invoke_viiijiiiiii": invoke_viiijiiiiii, "invoke_iiiifii": invoke_iiiifii, "invoke_viiffii": invoke_viiffii, "invoke_f": invoke_f, "invoke_jiiii": invoke_jiiii, "invoke_viijii": invoke_viijii, "invoke_viiiifiiiiif": invoke_viiiifiiiiif, "invoke_viififi": invoke_viififi, "invoke_viii": invoke_viii, "invoke_viiiifi": invoke_viiiifi, "invoke_jiii": invoke_jiii, "invoke_iiji": invoke_iiji, "invoke_viif": invoke_viif, "invoke_vijiii": invoke_vijiii, "invoke_fiiifi": invoke_fiiifi, "invoke_iiiifi": invoke_iiiifi, "invoke_v": invoke_v, "invoke_vd": invoke_vd, "invoke_viifi": invoke_viifi, "invoke_fiifi": invoke_fiifi, "invoke_vi": invoke_vi, "invoke_iiiiiiiiiii": invoke_iiiiiiiiiii, "invoke_iiiiiiiffiiiiiiiiiffffiiii": invoke_iiiiiiiffiiiiiiiiiffffiiii, "invoke_vijj": invoke_vijj, "invoke_ii": invoke_ii, "invoke_vifffi": invoke_vifffi, "invoke_iijji": invoke_iijji, "invoke_iiiiifiiiiii": invoke_iiiiifiiiiii, "invoke_iiiiifiiiiif": invoke_iiiiifiiiiif, "invoke_jifi": invoke_jifi, "invoke_viiiiiiiiiiii": invoke_viiiiiiiiiiii, "invoke_iifi": invoke_iifi, "invoke_viiif": invoke_viiif, "invoke_fifffi": invoke_fifffi, "invoke_jiiiii": invoke_jiiiii, "invoke_vifiiiiiiiiiiiiiiiiiiiiiii": invoke_vifiiiiiiiiiiiiiiiiiiiiiii, "invoke_iiiffii": invoke_iiiffii, "invoke_vijiijiii": invoke_vijiijiii, "invoke_iiifi": invoke_iiifi, "invoke_iiii": invoke_iiii, "invoke_fidi": invoke_fidi, "invoke_iiij": invoke_iiij, "invoke_viifff": invoke_viifff, "invoke_viiffi": invoke_viiffi, "invoke_iiif": invoke_iiif, "invoke_viffiii": invoke_viffiii, "invoke_diiiii": invoke_diiiii, "invoke_viiifi": invoke_viiifi, "invoke_fiiffi": invoke_fiiffi, "invoke_iiiiiiffiiiiiiiiiffffiiii": invoke_iiiiiiffiiiiiiiiiffffiiii, "invoke_iiiiiiiiiiiii": invoke_iiiiiiiiiiiii, "invoke_viifffi": invoke_viifffi, "invoke_vifffii": invoke_vifffii, "invoke_iiiifiii": invoke_iiiifiii, "invoke_ff": invoke_ff, "invoke_iiiifiiiii": invoke_iiiifiiiii, "invoke_iijii": invoke_iijii, "invoke_iiiiiiiiiiiiiii": invoke_iiiiiiiiiiiiiii, "invoke_vfi": invoke_vfi, "invoke_i": invoke_i, "invoke_iiidii": invoke_iiidii, "invoke_viiifiiiii": invoke_viiifiiiii, "invoke_viiiiifffi": invoke_viiiiifffi, "invoke_iiiiiijii": invoke_iiiiiijii, "invoke_viijjji": invoke_viijjji, "invoke_iiiiiiiii": invoke_iiiiiiiii, "invoke_viffffi": invoke_viffffi, "_emscripten_glGetTexParameterfv": _emscripten_glGetTexParameterfv, "_glClearStencil": _glClearStencil, "___syscall220": ___syscall220, "_emscripten_glBlendFuncSeparate": _emscripten_glBlendFuncSeparate, "_glTexParameteriv": _glTexParameteriv, "_glUniformMatrix4fv": _glUniformMatrix4fv, "___assert_fail": ___assert_fail, "_glVertexAttrib4f": _glVertexAttrib4f, "_emscripten_glDepthFunc": _emscripten_glDepthFunc, "_emscripten_webgl_create_context": _emscripten_webgl_create_context, "_pthread_key_delete": _pthread_key_delete, "_glDisableVertexAttribArray": _glDisableVertexAttribArray, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_pthread_attr_init": _pthread_attr_init, "_emscripten_glUniform1f": _emscripten_glUniform1f, "_Mix_PlayMusic": _Mix_PlayMusic, "___syscall221": ___syscall221, "_glInvalidateFramebuffer": _glInvalidateFramebuffer, "_emscripten_glVertexAttrib2f": _emscripten_glVertexAttrib2f, "_emscripten_glUniform1i": _emscripten_glUniform1i, "_emscripten_glGetIntegerv": _emscripten_glGetIntegerv, "_emscripten_glIsProgram": _emscripten_glIsProgram, "_glGenSamplers": _glGenSamplers, "_emscripten_webgl_make_context_current": _emscripten_webgl_make_context_current, "_glEndTransformFeedback": _glEndTransformFeedback, "_glFramebufferRenderbuffer": _glFramebufferRenderbuffer, "_gmtime_r": _gmtime_r, "_emscripten_glTexParameteriv": _emscripten_glTexParameteriv, "___syscall140": ___syscall140, "___syscall145": ___syscall145, "___syscall146": ___syscall146, "_glUniform1uiv": _glUniform1uiv, "_emscripten_glAttachShader": _emscripten_glAttachShader, "_emscripten_get_now_is_monotonic": _emscripten_get_now_is_monotonic, "_pthread_cond_timedwait": _pthread_cond_timedwait, "_emscripten_glTexParameterfv": _emscripten_glTexParameterfv, "_pthread_attr_destroy": _pthread_attr_destroy, "_emscripten_glUniformMatrix2fv": _emscripten_glUniformMatrix2fv, "_SDL_GetTicks": _SDL_GetTicks, "_emscripten_glDrawArraysInstanced": _emscripten_glDrawArraysInstanced, "___syscall183": ___syscall183, "_glDepthMask": _glDepthMask, "_emscripten_glVertexAttrib2fv": _emscripten_glVertexAttrib2fv, "_glViewport": _glViewport, "_emscripten_glFlush": _emscripten_glFlush, "_glBufferData": _glBufferData, "___syscall91": ___syscall91, "_pthread_once": _pthread_once, "_glDrawArraysInstanced": _glDrawArraysInstanced, "_JS_Sound_SetListenerOrientation": _JS_Sound_SetListenerOrientation, "_emscripten_glGetAttribLocation": _emscripten_glGetAttribLocation, "_glBeginQuery": _glBeginQuery, "_glAttachShader": _glAttachShader, "_emscripten_glTexCoordPointer": _emscripten_glTexCoordPointer, "_emscripten_set_blur_callback": _emscripten_set_blur_callback, "_emscripten_glLoadMatrixf": _emscripten_glLoadMatrixf, "_emscripten_glStencilFuncSeparate": _emscripten_glStencilFuncSeparate, "_emscripten_glVertexAttrib3f": _emscripten_glVertexAttrib3f, "_emscripten_webgl_enable_extension": _emscripten_webgl_enable_extension, "_glCullFace": _glCullFace, "_emscripten_get_gamepad_status": _emscripten_get_gamepad_status, "_sched_yield": _sched_yield, "_JS_Eval_OpenURL": _JS_Eval_OpenURL, "_glCompressedTexImage2D": _glCompressedTexImage2D, "_emscripten_glUniform1iv": _emscripten_glUniform1iv, "emscriptenWebGLGetUniform": emscriptenWebGLGetUniform, "_glClearColor": _glClearColor, "_glFinish": _glFinish, "_emscripten_glUniform3iv": _emscripten_glUniform3iv, "_emscripten_glGetBufferParameteriv": _emscripten_glGetBufferParameteriv, "_emscripten_glVertexAttrib4fv": _emscripten_glVertexAttrib4fv, "_glGetTexParameteriv": _glGetTexParameteriv, "_pthread_getspecific": _pthread_getspecific, "_glDrawArrays": _glDrawArrays, "_pthread_cond_signal": _pthread_cond_signal, "_emscripten_glDepthRange": _emscripten_glDepthRange, "_glActiveTexture": _glActiveTexture, "_emscripten_asm_const_iii": _emscripten_asm_const_iii, "_emscripten_glCopyTexImage2D": _emscripten_glCopyTexImage2D, "_emscripten_glFramebufferTexture2D": _emscripten_glFramebufferTexture2D, "_glEnableVertexAttribArray": _glEnableVertexAttribArray, "_emscripten_glStencilFunc": _emscripten_glStencilFunc, "_glBindVertexArray": _glBindVertexArray, "_glVertexAttribIPointer": _glVertexAttribIPointer, "_glDeleteBuffers": _glDeleteBuffers, "_localtime": _localtime, "_glGetUniformBlockIndex": _glGetUniformBlockIndex, "_glGetActiveUniformBlockName": _glGetActiveUniformBlockName, "_glRenderbufferStorageMultisample": _glRenderbufferStorageMultisample, "_glCompressedTexSubImage2D": _glCompressedTexSubImage2D, "_emscripten_glRenderbufferStorage": _emscripten_glRenderbufferStorage, "emscriptenWebGLComputeImageSize": emscriptenWebGLComputeImageSize, "_emscripten_set_keydown_callback": _emscripten_set_keydown_callback, "_emscripten_glVertexPointer": _emscripten_glVertexPointer, "_JS_SystemInfo_GetHeight": _JS_SystemInfo_GetHeight, "_emscripten_glBufferSubData": _emscripten_glBufferSubData, "_emscripten_glGetUniformfv": _emscripten_glGetUniformfv, "_SDL_FreeRW": _SDL_FreeRW, "_glFramebufferTextureLayer": _glFramebufferTextureLayer, "_glDeleteQueries": _glDeleteQueries, "_Mix_LoadWAV_RW": _Mix_LoadWAV_RW, "_emscripten_glStencilOp": _emscripten_glStencilOp, "_emscripten_glBlendEquation": _emscripten_glBlendEquation, "_glTexImage3D": _glTexImage3D, "emscriptenWebGLGetIndexed": emscriptenWebGLGetIndexed, "_emscripten_glVertexAttrib1fv": _emscripten_glVertexAttrib1fv, "_TTF_SizeText": _TTF_SizeText, "_emscripten_glDeleteBuffers": _emscripten_glDeleteBuffers, "_glLinkProgram": _glLinkProgram, "_emscripten_glGetProgramInfoLog": _emscripten_glGetProgramInfoLog, "_emscripten_glUniform4fv": _emscripten_glUniform4fv, "___cxa_throw": ___cxa_throw, "_JS_SystemInfo_GetCurrentCanvasWidth": _JS_SystemInfo_GetCurrentCanvasWidth, "_glUniform1iv": _glUniform1iv, "_emscripten_glUniform2fv": _emscripten_glUniform2fv, "_emscripten_glBindBuffer": _emscripten_glBindBuffer, "_emscripten_glGetFloatv": _emscripten_glGetFloatv, "_pthread_mutex_init": _pthread_mutex_init, "_glBlendEquationSeparate": _glBlendEquationSeparate, "_glTexSubImage2D": _glTexSubImage2D, "_glUseProgram": _glUseProgram, "_glUniformMatrix3fv": _glUniformMatrix3fv, "_emscripten_glCullFace": _emscripten_glCullFace, "_glBindTransformFeedback": _glBindTransformFeedback, "_emscripten_glStencilMaskSeparate": _emscripten_glStencilMaskSeparate, "_emscripten_glUniform3fv": _emscripten_glUniform3fv, "_glBindBuffer": _glBindBuffer, "_emscripten_request_fullscreen": _emscripten_request_fullscreen, "_JS_Sound_Play": _JS_Sound_Play, "_emscripten_glDisableVertexAttribArray": _emscripten_glDisableVertexAttribArray, "_TTF_RenderText_Solid": _TTF_RenderText_Solid, "_glPolygonOffset": _glPolygonOffset, "_emscripten_webgl_get_current_context": _emscripten_webgl_get_current_context, "_emscripten_set_touchstart_callback": _emscripten_set_touchstart_callback, "_JS_Sound_SetListenerPosition": _JS_Sound_SetListenerPosition, "_emscripten_glGetBooleanv": _emscripten_glGetBooleanv, "_glProgramBinary": _glProgramBinary, "_emscripten_glVertexAttribDivisor": _emscripten_glVertexAttribDivisor, "_JS_Eval_SetTimeout": _JS_Eval_SetTimeout, "_glDrawElementsInstanced": _glDrawElementsInstanced, "_emscripten_glDeleteObjectARB": _emscripten_glDeleteObjectARB, "_emscripten_glUniform4f": _emscripten_glUniform4f, "_emscripten_glGetShaderPrecisionFormat": _emscripten_glGetShaderPrecisionFormat, "_JS_SystemInfo_GetLanguage": _JS_SystemInfo_GetLanguage, "_emscripten_glIsEnabled": _emscripten_glIsEnabled, "_JS_SystemInfo_HasFullscreen": _JS_SystemInfo_HasFullscreen, "_emscripten_glStencilOpSeparate": _emscripten_glStencilOpSeparate, "_JS_Sound_Set3D": _JS_Sound_Set3D, "_pthread_cleanup_pop": _pthread_cleanup_pop, "_glGenerateMipmap": _glGenerateMipmap, "_JS_Sound_SetPosition": _JS_Sound_SetPosition, "___syscall122": ___syscall122, "___cxa_find_matching_catch": ___cxa_find_matching_catch, "_JS_SystemInfo_HasCursorLock": _JS_SystemInfo_HasCursorLock, "_emscripten_glClear": _emscripten_glClear, "_glDrawElements": _glDrawElements, "_JS_WebRequest_Send": _JS_WebRequest_Send, "_emscripten_glValidateProgram": _emscripten_glValidateProgram, "_emscripten_glUniform4iv": _emscripten_glUniform4iv, "___setErrNo": ___setErrNo, "_glStencilOpSeparate": _glStencilOpSeparate, "_JS_WebRequest_Abort": _JS_WebRequest_Abort, "___resumeException": ___resumeException, "_emscripten_glBlendFunc": _emscripten_glBlendFunc, "_mktime": _mktime, "_emscripten_glGetError": _emscripten_glGetError, "_emscripten_glBufferData": _emscripten_glBufferData, "_emscripten_glStencilMask": _emscripten_glStencilMask, "_glGenTextures": _glGenTextures, "_glGetIntegerv": _glGetIntegerv, "_glUniform3iv": _glUniform3iv, "_emscripten_glClearStencil": _emscripten_glClearStencil, "_JS_Sound_Stop": _JS_Sound_Stop, "emscriptenWebGLGet": emscriptenWebGLGet, "_emscripten_set_mouseup_callback": _emscripten_set_mouseup_callback, "_emscripten_glFinish": _emscripten_glFinish, "_emscripten_glClearDepth": _emscripten_glClearDepth, "_emscripten_glUniform1fv": _emscripten_glUniform1fv, "_glBindFramebuffer": _glBindFramebuffer, "_glValidateProgram": _glValidateProgram, "_glGenFramebuffers": _glGenFramebuffers, "_SDL_UpperBlitScaled": _SDL_UpperBlitScaled, "_emscripten_glUniform4i": _emscripten_glUniform4i, "_glUniform1fv": _glUniform1fv, "_llvm_pow_f64": _llvm_pow_f64, "__emscripten_sample_gamepad_data": __emscripten_sample_gamepad_data, "_glDeleteFramebuffers": _glDeleteFramebuffers, "_JS_FileSystem_Sync": _JS_FileSystem_Sync, "_IMG_Load": _IMG_Load, "_glCheckFramebufferStatus": _glCheckFramebufferStatus, "_JS_WebRequest_GetStatusLine": _JS_WebRequest_GetStatusLine, "_emscripten_glCreateShader": _emscripten_glCreateShader, "_glGetProgramBinary": _glGetProgramBinary, "___syscall192": ___syscall192, "_glProgramParameteri": _glProgramParameteri, "_localtime_r": _localtime_r, "_glBindTexture": _glBindTexture, "_strftime": _strftime, "_emscripten_glGetVertexAttribiv": _emscripten_glGetVertexAttribiv, "_glReadPixels": _glReadPixels, "_glGetActiveAttrib": _glGetActiveAttrib, "_emscripten_glUniformMatrix3fv": _emscripten_glUniformMatrix3fv, "_glUniform2iv": _glUniform2iv, "___syscall33": ___syscall33, "_pthread_key_create": _pthread_key_create, "_emscripten_glDeleteFramebuffers": _emscripten_glDeleteFramebuffers, "__setLetterbox": __setLetterbox, "___syscall39": ___syscall39, "___syscall38": ___syscall38, "_getpwuid": _getpwuid, "_glFrontFace": _glFrontFace, "_emscripten_glGetObjectParameterivARB": _emscripten_glGetObjectParameterivARB, "_glGetUniformiv": _glGetUniformiv, "_JS_SystemInfo_HasWebGL": _JS_SystemInfo_HasWebGL, "_emscripten_glGetUniformiv": _emscripten_glGetUniformiv, "_glGetActiveUniformBlockiv": _glGetActiveUniformBlockiv, "_glGetProgramiv": _glGetProgramiv, "___syscall168": ___syscall168, "_glScissor": _glScissor, "_emscripten_glClearColor": _emscripten_glClearColor, "_glGetFramebufferAttachmentParameteriv": _glGetFramebufferAttachmentParameteriv, "_difftime": _difftime, "_emscripten_set_mousemove_callback": _emscripten_set_mousemove_callback, "_glBlitFramebuffer": _glBlitFramebuffer, "_emscripten_glDeleteTextures": _emscripten_glDeleteTextures, "_emscripten_exit_fullscreen": _emscripten_exit_fullscreen, "_glGetShaderiv": _glGetShaderiv, "_glBindBufferBase": _glBindBufferBase, "_glUniform4fv": _glUniform4fv, "_glTexSubImage3D": _glTexSubImage3D, "__exit": __exit, "_IMG_Load_RW": _IMG_Load_RW, "_glBindAttribLocation": _glBindAttribLocation, "_emscripten_glColorMask": _emscripten_glColorMask, "_emscripten_webgl_destroy_context": _emscripten_webgl_destroy_context, "_emscripten_glBindTexture": _emscripten_glBindTexture, "_glDeleteSamplers": _glDeleteSamplers, "_glUniform4iv": _glUniform4iv, "_emscripten_set_main_loop": _emscripten_set_main_loop, "_glUniformBlockBinding": _glUniformBlockBinding, "_emscripten_glIsShader": _emscripten_glIsShader, "_emscripten_glCompressedTexImage2D": _emscripten_glCompressedTexImage2D, "_glDisable": _glDisable, "_emscripten_glGetInfoLogARB": _emscripten_glGetInfoLogARB, "_emscripten_longjmp": _emscripten_longjmp, "_atexit": _atexit, "_glFenceSync": _glFenceSync, "_glStencilFuncSeparate": _glStencilFuncSeparate, "_JS_Sound_ReleaseInstance": _JS_Sound_ReleaseInstance, "_emscripten_glGenRenderbuffers": _emscripten_glGenRenderbuffers, "_JS_SystemInfo_GetCurrentCanvasHeight": _JS_SystemInfo_GetCurrentCanvasHeight, "_JS_WebRequest_GetResponseHeaders": _JS_WebRequest_GetResponseHeaders, "_emscripten_glReleaseShaderCompiler": _emscripten_glReleaseShaderCompiler, "__ZN4FMOD13DSPConnection6setMixEf": __ZN4FMOD13DSPConnection6setMixEf, "_flock": _flock, "_SDL_RWFromFile": _SDL_RWFromFile, "_glUniform2fv": _glUniform2fv, "_emscripten_glFrontFace": _emscripten_glFrontFace, "_glDeleteProgram": _glDeleteProgram, "__ZSt18uncaught_exceptionv": __ZSt18uncaught_exceptionv, "_glBlendEquation": _glBlendEquation, "_emscripten_glUseProgram": _emscripten_glUseProgram, "_glCreateProgram": _glCreateProgram, "_clock_gettime": _clock_gettime, "_emscripten_set_touchmove_callback": _emscripten_set_touchmove_callback, "_glGetAttribLocation": _glGetAttribLocation, "_Mix_PlayChannel": _Mix_PlayChannel, "_glCreateShader": _glCreateShader, "_emscripten_glReadPixels": _emscripten_glReadPixels, "_sysconf": _sysconf, "_utime": _utime, "_glEndQuery": _glEndQuery, "_pthread_mutexattr_settype": _pthread_mutexattr_settype, "_glTexStorage2D": _glTexStorage2D, "_glGenBuffers": _glGenBuffers, "_glShaderSource": _glShaderSource, "_emscripten_glScissor": _emscripten_glScissor, "_glUniform3uiv": _glUniform3uiv, "_pthread_cleanup_push": _pthread_cleanup_push, "_llvm_trap": _llvm_trap, "_JS_Sound_SetVolume": _JS_Sound_SetVolume, "_JS_Cursor_SetShow": _JS_Cursor_SetShow, "_glPixelStorei": _glPixelStorei, "_emscripten_glIsBuffer": _emscripten_glIsBuffer, "_emscripten_glVertexAttrib1f": _emscripten_glVertexAttrib1f, "_glVertexAttribPointer": _glVertexAttribPointer, "_emscripten_glCompressedTexSubImage2D": _emscripten_glCompressedTexSubImage2D, "_glSamplerParameteri": _glSamplerParameteri, "_glBindSampler": _glBindSampler, "_JS_WebRequest_Release": _JS_WebRequest_Release, "_emscripten_get_main_loop_timing": _emscripten_get_main_loop_timing, "_glGetVertexAttribiv": _glGetVertexAttribiv, "_JS_Log_Dump": _JS_Log_Dump, "_emscripten_glGetAttachedShaders": _emscripten_glGetAttachedShaders, "_emscripten_glGenTextures": _emscripten_glGenTextures, "_JS_Cursor_SetCursorString": _JS_Cursor_SetCursorString, "_glBindRenderbuffer": _glBindRenderbuffer, "_pthread_cond_init": _pthread_cond_init, "_SDL_LockSurface": _SDL_LockSurface, "_gmtime": _gmtime, "_emscripten_glGetTexParameteriv": _emscripten_glGetTexParameteriv, "_glDeleteTextures": _glDeleteTextures, "_emscripten_set_mousedown_callback": _emscripten_set_mousedown_callback, "_Mix_HaltMusic": _Mix_HaltMusic, "_emscripten_glClientActiveTexture": _emscripten_glClientActiveTexture, "_emscripten_glCheckFramebufferStatus": _emscripten_glCheckFramebufferStatus, "_emscripten_glUniform3f": _emscripten_glUniform3f, "_emscripten_glUniform3i": _emscripten_glUniform3i, "_glDrawBuffers": _glDrawBuffers, "_emscripten_glDeleteShader": _emscripten_glDeleteShader, "_glEnable": _glEnable, "_glUnmapBuffer": _glUnmapBuffer, "_glGetString": _glGetString, "_emscripten_glGetUniformLocation": _emscripten_glGetUniformLocation, "_emscripten_glEnableVertexAttribArray": _emscripten_glEnableVertexAttribArray, "_emscripten_get_now": _emscripten_get_now, "_emscripten_glGenFramebuffers": _emscripten_glGenFramebuffers, "emscriptenWebGLGetTexPixelData": emscriptenWebGLGetTexPixelData, "_gettimeofday": _gettimeofday, "___syscall202": ___syscall202, "_emscripten_glEnableClientState": _emscripten_glEnableClientState, "_JS_Sound_Init": _JS_Sound_Init, "_TTF_FontHeight": _TTF_FontHeight, "_emscripten_glDrawElements": _emscripten_glDrawElements, "_emscripten_get_num_gamepads": _emscripten_get_num_gamepads, "___buildEnvironment": ___buildEnvironment, "_glClearDepthf": _glClearDepthf, "_tzset": _tzset, "_glIsEnabled": _glIsEnabled, "_emscripten_glDisable": _emscripten_glDisable, "_emscripten_glDeleteRenderbuffers": _emscripten_glDeleteRenderbuffers, "_emscripten_glDrawElementsInstanced": _emscripten_glDrawElementsInstanced, "_emscripten_glVertexAttrib4f": _emscripten_glVertexAttrib4f, "_JS_Sound_Create_Channel": _JS_Sound_Create_Channel, "_emscripten_glPixelStorei": _emscripten_glPixelStorei, "_llvm_fabs_f32": _llvm_fabs_f32, "_glCopyBufferSubData": _glCopyBufferSubData, "_getenv": _getenv, "_emscripten_glFramebufferRenderbuffer": _emscripten_glFramebufferRenderbuffer, "_glReadBuffer": _glReadBuffer, "_emscripten_glRotatef": _emscripten_glRotatef, "_emscripten_glGetShaderiv": _emscripten_glGetShaderiv, "_JS_Eval_ClearTimeout": _JS_Eval_ClearTimeout, "___cxa_pure_virtual": ___cxa_pure_virtual, "_emscripten_glUniformMatrix4fv": _emscripten_glUniformMatrix4fv, "_emscripten_glGetPointerv": _emscripten_glGetPointerv, "_pthread_cond_wait": _pthread_cond_wait, "_clock": _clock, "_emscripten_glIsRenderbuffer": _emscripten_glIsRenderbuffer, "_emscripten_request_pointerlock": _emscripten_request_pointerlock, "___syscall40": ___syscall40, "___syscall42": ___syscall42, "_emscripten_set_touchcancel_callback": _emscripten_set_touchcancel_callback, "_glDeleteRenderbuffers": _glDeleteRenderbuffers, "_glGetShaderPrecisionFormat": _glGetShaderPrecisionFormat, "_JS_SystemInfo_GetMemory": _JS_SystemInfo_GetMemory, "_JS_Sound_SetLoop": _JS_Sound_SetLoop, "_JS_WebRequest_SetResponseHandler": _JS_WebRequest_SetResponseHandler, "_emscripten_set_focus_callback": _emscripten_set_focus_callback, "_pthread_mutexattr_destroy": _pthread_mutexattr_destroy, "_emscripten_glGetVertexAttribfv": _emscripten_glGetVertexAttribfv, "_SDL_PauseAudio": _SDL_PauseAudio, "_emscripten_glVertexAttrib3fv": _emscripten_glVertexAttrib3fv, "_glGetUniformLocation": _glGetUniformLocation, "_emscripten_glCompileShader": _emscripten_glCompileShader, "_glClear": _glClear, "_glBeginTransformFeedback": _glBeginTransformFeedback, "__arraySum": __arraySum, "_emscripten_glLinkProgram": _emscripten_glLinkProgram, "_JS_WebRequest_Create": _JS_WebRequest_Create, "_emscripten_get_pointerlock_status": _emscripten_get_pointerlock_status, "_emscripten_glDrawRangeElements": _emscripten_glDrawRangeElements, "___unlock": ___unlock, "_pthread_create": _pthread_create, "_glGetActiveUniformsiv": _glGetActiveUniformsiv, "_pthread_setspecific": _pthread_setspecific, "_glColorMask": _glColorMask, "_emscripten_glGenBuffers": _emscripten_glGenBuffers, "_glCopyTexSubImage2D": _glCopyTexSubImage2D, "_emscripten_glCreateProgram": _emscripten_glCreateProgram, "_JS_WebRequest_SetProgressHandler": _JS_WebRequest_SetProgressHandler, "_glTexParameteri": _glTexParameteri, "_pthread_cond_destroy": _pthread_cond_destroy, "_emscripten_glDetachShader": _emscripten_glDetachShader, "_SDL_RWFromConstMem": _SDL_RWFromConstMem, "_glTexParameterf": _glTexParameterf, "_setenv": _setenv, "_emscripten_do_request_fullscreen": _emscripten_do_request_fullscreen, "_glGenQueries": _glGenQueries, "_emscripten_glGetRenderbufferParameteriv": _emscripten_glGetRenderbufferParameteriv, "_emscripten_set_fullscreenchange_callback": _emscripten_set_fullscreenchange_callback, "_emscripten_glVertexAttribPointer": _emscripten_glVertexAttribPointer, "_glTexStorage3D": _glTexStorage3D, "_glIsVertexArray": _glIsVertexArray, "_JS_SystemInfo_GetBrowserName": _JS_SystemInfo_GetBrowserName, "_emscripten_glDrawArrays": _emscripten_glDrawArrays, "_emscripten_glPolygonOffset": _emscripten_glPolygonOffset, "_longjmp": _longjmp, "_emscripten_glBlendColor": _emscripten_glBlendColor, "_glGetShaderInfoLog": _glGetShaderInfoLog, "_emscripten_set_main_loop_timing": _emscripten_set_main_loop_timing, "___cxa_begin_catch": ___cxa_begin_catch, "_emscripten_glGetProgramiv": _emscripten_glGetProgramiv, "_glDeleteSync": _glDeleteSync, "__addDays": __addDays, "_emscripten_glGetShaderSource": _emscripten_glGetShaderSource, "_emscripten_glTexImage2D": _emscripten_glTexImage2D, "_glRenderbufferStorage": _glRenderbufferStorage, "__isLeapYear": __isLeapYear, "_JS_Sound_GetLength": _JS_Sound_GetLength, "_emscripten_glBlendEquationSeparate": _emscripten_glBlendEquationSeparate, "_emscripten_glGetString": _emscripten_glGetString, "_emscripten_glIsFramebuffer": _emscripten_glIsFramebuffer, "_glUniform2uiv": _glUniform2uiv, "_unsetenv": _unsetenv, "_emscripten_glBindProgramARB": _emscripten_glBindProgramARB, "_JS_Sound_SetLoopPoints": _JS_Sound_SetLoopPoints, "_pthread_detach": _pthread_detach, "_emscripten_set_devicemotion_callback": _emscripten_set_devicemotion_callback, "___syscall85": ___syscall85, "_emscripten_glUniform2i": _emscripten_glUniform2i, "_emscripten_glUniform2f": _emscripten_glUniform2f, "_glGenTransformFeedbacks": _glGenTransformFeedbacks, "_JS_SystemInfo_GetWidth": _JS_SystemInfo_GetWidth, "_glGetProgramInfoLog": _glGetProgramInfoLog, "_emscripten_glTexParameterf": _emscripten_glTexParameterf, "_emscripten_glTexParameteri": _emscripten_glTexParameteri, "_JS_Sound_Load": _JS_Sound_Load, "_JS_Sound_Load_PCM": _JS_Sound_Load_PCM, "_emscripten_glGenVertexArrays": _emscripten_glGenVertexArrays, "_llvm_cttz_i32": _llvm_cttz_i32, "_glDeleteVertexArrays": _glDeleteVertexArrays, "_glGetStringi": _glGetStringi, "_emscripten_glBindAttribLocation": _emscripten_glBindAttribLocation, "_llvm_pow_f32": _llvm_pow_f32, "_glDepthFunc": _glDepthFunc, "___cxa_allocate_exception": ___cxa_allocate_exception, "_emscripten_set_canvas_size": _emscripten_set_canvas_size, "_emscripten_glClearDepthf": _emscripten_glClearDepthf, "_JS_SystemInfo_GetDocumentURL": _JS_SystemInfo_GetDocumentURL, "_emscripten_glMatrixMode": _emscripten_glMatrixMode, "_glBlendFuncSeparate": _glBlendFuncSeparate, "___syscall10": ___syscall10, "_emscripten_glNormalPointer": _emscripten_glNormalPointer, "_emscripten_glHint": _emscripten_glHint, "_emscripten_glEnable": _emscripten_glEnable, "___syscall3": ___syscall3, "___lock": ___lock, "_emscripten_glBindFramebuffer": _emscripten_glBindFramebuffer, "___syscall6": ___syscall6, "___syscall5": ___syscall5, "___syscall4": ___syscall4, "_emscripten_glBindRenderbuffer": _emscripten_glBindRenderbuffer, "_time": _time, "_emscripten_glGetFramebufferAttachmentParameteriv": _emscripten_glGetFramebufferAttachmentParameteriv, "_emscripten_set_wheel_callback": _emscripten_set_wheel_callback, "_exit": _exit, "_emscripten_glGetActiveAttrib": _emscripten_glGetActiveAttrib, "_putenv": _putenv, "___syscall268": ___syscall268, "_emscripten_set_keypress_callback": _emscripten_set_keypress_callback, "_JS_SystemInfo_GetOS": _JS_SystemInfo_GetOS, "_glMapBufferRange": _glMapBufferRange, "_JS_SystemInfo_GetBrowserVersionString": _JS_SystemInfo_GetBrowserVersionString, "_glGetIntegeri_v": _glGetIntegeri_v, "_glFramebufferTexture2D": _glFramebufferTexture2D, "_JS_Cursor_SetImage": _JS_Cursor_SetImage, "_emscripten_glShaderBinary": _emscripten_glShaderBinary, "_emscripten_glGetShaderInfoLog": _emscripten_glGetShaderInfoLog, "_glUniform3fv": _glUniform3fv, "_emscripten_glGetVertexAttribPointerv": _emscripten_glGetVertexAttribPointerv, "_glClientWaitSync": _glClientWaitSync, "_JS_FileSystem_SetSyncInterval": _JS_FileSystem_SetSyncInterval, "_emscripten_set_deviceorientation_callback": _emscripten_set_deviceorientation_callback, "___syscall193": ___syscall193, "_emscripten_glGetActiveUniform": _emscripten_glGetActiveUniform, "emscriptenWebGLGetVertexAttrib": emscriptenWebGLGetVertexAttrib, "___syscall197": ___syscall197, "___syscall196": ___syscall196, "___syscall195": ___syscall195, "___syscall194": ___syscall194, "___syscall199": ___syscall199, "_emscripten_glDeleteProgram": _emscripten_glDeleteProgram, "_glUniform1i": _glUniform1i, "_glFlushMappedBufferRange": _glFlushMappedBufferRange, "_emscripten_glTexSubImage2D": _emscripten_glTexSubImage2D, "_pthread_mutex_destroy": _pthread_mutex_destroy, "_emscripten_glColorPointer": _emscripten_glColorPointer, "_glTransformFeedbackVaryings": _glTransformFeedbackVaryings, "_glGetShaderSource": _glGetShaderSource, "_emscripten_glViewport": _emscripten_glViewport, "_emscripten_glDepthMask": _emscripten_glDepthMask, "_emscripten_glDrawBuffers": _emscripten_glDrawBuffers, "_emscripten_glLineWidth": _emscripten_glLineWidth, "_glCompileShader": _glCompileShader, "_emscripten_exit_pointerlock": _emscripten_exit_pointerlock, "_JS_WebRequest_SetRequestHeader": _JS_WebRequest_SetRequestHeader, "_abort": _abort, "_JS_Sound_GetLoadState": _JS_Sound_GetLoadState, "_glTexImage2D": _glTexImage2D, "_glUniform4uiv": _glUniform4uiv, "_glFlush": _glFlush, "_emscripten_glLoadIdentity": _emscripten_glLoadIdentity, "_glDeleteShader": _glDeleteShader, "_emscripten_glShaderSource": _emscripten_glShaderSource, "_glGenVertexArrays": _glGenVertexArrays, "_SDL_CloseAudio": _SDL_CloseAudio, "___gxx_personality_v0": ___gxx_personality_v0, "_emscripten_get_fullscreen_status": _emscripten_get_fullscreen_status, "_emscripten_set_touchend_callback": _emscripten_set_touchend_callback, "_glGetError": _glGetError, "_glGenRenderbuffers": _glGenRenderbuffers, "_emscripten_glSampleCoverage": _emscripten_glSampleCoverage, "_emscripten_glFrustum": _emscripten_glFrustum, "_Mix_FreeChunk": _Mix_FreeChunk, "_emscripten_glDepthRangef": _emscripten_glDepthRangef, "_JS_Sound_SetPitch": _JS_Sound_SetPitch, "_emscripten_glGenerateMipmap": _emscripten_glGenerateMipmap, "_glCopyTexImage2D": _glCopyTexImage2D, "_emscripten_glIsTexture": _emscripten_glIsTexture, "_glCompressedTexSubImage3D": _glCompressedTexSubImage3D, "_emscripten_glBindVertexArray": _emscripten_glBindVertexArray, "_SDL_UpperBlit": _SDL_UpperBlit, "___syscall51": ___syscall51, "_emscripten_glActiveTexture": _emscripten_glActiveTexture, "_emscripten_set_keyup_callback": _emscripten_set_keyup_callback, "_emscripten_glDeleteVertexArrays": _emscripten_glDeleteVertexArrays, "___syscall54": ___syscall54, "_glDeleteTransformFeedbacks": _glDeleteTransformFeedbacks, "_emscripten_glUniform2iv": _emscripten_glUniform2iv, "_pthread_mutexattr_init": _pthread_mutexattr_init, "_glBufferSubData": _glBufferSubData, "_emscripten_webgl_init_context_attributes": _emscripten_webgl_init_context_attributes, "_SDL_GL_SwapBuffers": _SDL_GL_SwapBuffers, "_emscripten_glCopyTexSubImage2D": _emscripten_glCopyTexSubImage2D, "_glGetInternalformativ": _glGetInternalformativ, "_glGetActiveUniform": _glGetActiveUniform, "_glStencilMask": _glStencilMask, "DYNAMICTOP_PTR": DYNAMICTOP_PTR, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "cttz_i8": cttz_i8 };
// EMSCRIPTEN_START_ASM
var asm =Module["asm"]// EMSCRIPTEN_END_ASM
(Module.asmGlobalArg, Module.asmLibraryArg, buffer);
Module["asm"] = asm;
var __GLOBAL__sub_I_File_cpp = Module["__GLOBAL__sub_I_File_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_File_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_video_lump_cpp = Module["__GLOBAL__sub_I_runtime_video_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_video_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_AppDomain_cpp = Module["__GLOBAL__sub_I_AppDomain_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_AppDomain_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_camera_renderlayers_lump_cpp = Module["__GLOBAL__sub_I_runtime_camera_renderlayers_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera_renderlayers_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_GenericMetadata_cpp = Module["__GLOBAL__sub_I_GenericMetadata_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_GenericMetadata_cpp"].apply(null, arguments) };
var _pthread_cond_broadcast = Module["_pthread_cond_broadcast"] = function() { return Module["asm"]["_pthread_cond_broadcast"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_graphics_mesh_lump_cpp = Module["__GLOBAL__sub_I_runtime_graphics_mesh_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_graphics_mesh_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_baseclasses_lump_cpp = Module["__GLOBAL__sub_I_runtime_baseclasses_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_baseclasses_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_Console_cpp = Module["__GLOBAL__sub_I_Console_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Console_cpp"].apply(null, arguments) };
var _sbrk = Module["_sbrk"] = function() { return Module["asm"]["_sbrk"].apply(null, arguments) };
var _memcpy = Module["_memcpy"] = function() { return Module["asm"]["_memcpy"].apply(null, arguments) };
var __GLOBAL__sub_I_GCHandle_cpp = Module["__GLOBAL__sub_I_GCHandle_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_GCHandle_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_MetadataCache_cpp = Module["__GLOBAL__sub_I_MetadataCache_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_MetadataCache_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_Assembly_cpp_42188 = Module["__GLOBAL__sub_I_Assembly_cpp_42188"] = function() { return Module["asm"]["__GLOBAL__sub_I_Assembly_cpp_42188"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_graphics5_lump_cpp = Module["__GLOBAL__sub_I_runtime_graphics5_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_graphics5_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_GlslGpuProgramGLES_cpp = Module["__GLOBAL__sub_I_GlslGpuProgramGLES_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_GlslGpuProgramGLES_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_animation3_lump_cpp = Module["__GLOBAL__sub_I_runtime_animation3_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_animation3_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_modules_particleslegacy_private_lump_cpp = Module["__GLOBAL__sub_I_modules_particleslegacy_private_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_modules_particleslegacy_private_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_utilities3_lump_cpp = Module["__GLOBAL__sub_I_runtime_utilities3_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_utilities3_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_preloadmanager_lump_cpp = Module["__GLOBAL__sub_I_runtime_preloadmanager_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_preloadmanager_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_SpriteRendererJobs_cpp = Module["__GLOBAL__sub_I_SpriteRendererJobs_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_SpriteRendererJobs_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_TextMeshGenerator_cpp = Module["__GLOBAL__sub_I_TextMeshGenerator_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_TextMeshGenerator_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_GenericMethod_cpp = Module["__GLOBAL__sub_I_GenericMethod_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_GenericMethod_cpp"].apply(null, arguments) };
var ___cxa_can_catch = Module["___cxa_can_catch"] = function() { return Module["asm"]["___cxa_can_catch"].apply(null, arguments) };
var _free = Module["_free"] = function() { return Module["asm"]["_free"].apply(null, arguments) };
var runPostSets = Module["runPostSets"] = function() { return Module["asm"]["runPostSets"].apply(null, arguments) };
var _strstr = Module["_strstr"] = function() { return Module["asm"]["_strstr"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_ui_lump_cpp = Module["__GLOBAL__sub_I_runtime_ui_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_ui_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_CmEventProfiler_cpp = Module["__GLOBAL__sub_I_CmEventProfiler_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_CmEventProfiler_cpp"].apply(null, arguments) };
var _memalign = Module["_memalign"] = function() { return Module["asm"]["_memalign"].apply(null, arguments) };
var __GLOBAL__sub_I_Socket_cpp = Module["__GLOBAL__sub_I_Socket_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Socket_cpp"].apply(null, arguments) };
var _SetFullscreen = Module["_SetFullscreen"] = function() { return Module["asm"]["_SetFullscreen"].apply(null, arguments) };
var _main = Module["_main"] = function() { return Module["asm"]["_main"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_core_callbacks_lump_cpp = Module["__GLOBAL__sub_I_runtime_core_callbacks_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_core_callbacks_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_camera3_lump_cpp = Module["__GLOBAL__sub_I_runtime_camera3_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera3_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_particlesystem_lump_cpp = Module["__GLOBAL__sub_I_runtime_particlesystem_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_particlesystem_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_umbra_cpp = Module["__GLOBAL__sub_I_umbra_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_umbra_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_PluginInterfaceVR_cpp = Module["__GLOBAL__sub_I_PluginInterfaceVR_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_PluginInterfaceVR_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_Environment_cpp = Module["__GLOBAL__sub_I_Environment_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Environment_cpp"].apply(null, arguments) };
var ___cxa_is_pointer_type = Module["___cxa_is_pointer_type"] = function() { return Module["asm"]["___cxa_is_pointer_type"].apply(null, arguments) };
var _llvm_ctlz_i64 = Module["_llvm_ctlz_i64"] = function() { return Module["asm"]["_llvm_ctlz_i64"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_physics2d_lump_cpp = Module["__GLOBAL__sub_I_runtime_physics2d_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_physics2d_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_graphics_lod_lump_cpp = Module["__GLOBAL__sub_I_runtime_graphics_lod_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_graphics_lod_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_VRGfxHelpers_cpp = Module["__GLOBAL__sub_I_VRGfxHelpers_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_VRGfxHelpers_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_RCW_cpp = Module["__GLOBAL__sub_I_RCW_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_RCW_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_Interlocked_cpp = Module["__GLOBAL__sub_I_Interlocked_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Interlocked_cpp"].apply(null, arguments) };
var _ntohs = Module["_ntohs"] = function() { return Module["asm"]["_ntohs"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_gfxdevice_lump_cpp = Module["__GLOBAL__sub_I_runtime_gfxdevice_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_gfxdevice_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_particlesystem_modules2_lump_cpp = Module["__GLOBAL__sub_I_runtime_particlesystem_modules2_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_particlesystem_modules2_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_MemoryMappedFile_cpp = Module["__GLOBAL__sub_I_MemoryMappedFile_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_MemoryMappedFile_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_graphics_billboard_lump_cpp = Module["__GLOBAL__sub_I_runtime_graphics_billboard_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_graphics_billboard_lump_cpp"].apply(null, arguments) };
var _llvm_bswap_i32 = Module["_llvm_bswap_i32"] = function() { return Module["asm"]["_llvm_bswap_i32"].apply(null, arguments) };
var __GLOBAL__sub_I_String_cpp = Module["__GLOBAL__sub_I_String_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_String_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_math_random_lump_cpp = Module["__GLOBAL__sub_I_runtime_math_random_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_math_random_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_Reflection_cpp = Module["__GLOBAL__sub_I_Reflection_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Reflection_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_SwSolverKernel_cpp = Module["__GLOBAL__sub_I_SwSolverKernel_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_SwSolverKernel_cpp"].apply(null, arguments) };
var _pthread_mutex_lock = Module["_pthread_mutex_lock"] = function() { return Module["asm"]["_pthread_mutex_lock"].apply(null, arguments) };
var __GLOBAL__sub_I_ArrayMetadata_cpp = Module["__GLOBAL__sub_I_ArrayMetadata_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_ArrayMetadata_cpp"].apply(null, arguments) };
var _roundf = Module["_roundf"] = function() { return Module["asm"]["_roundf"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_physics2d2_lump_cpp = Module["__GLOBAL__sub_I_runtime_physics2d2_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_physics2d2_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_LibraryLoader_cpp = Module["__GLOBAL__sub_I_LibraryLoader_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_LibraryLoader_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_terrain_lump_cpp = Module["__GLOBAL__sub_I_runtime_terrain_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_terrain_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_assetbundles_lump_cpp = Module["__GLOBAL__sub_I_runtime_assetbundles_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_assetbundles_lump_cpp"].apply(null, arguments) };
var _SendMessageFloat = Module["_SendMessageFloat"] = function() { return Module["asm"]["_SendMessageFloat"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_interfaces_lump_cpp = Module["__GLOBAL__sub_I_runtime_interfaces_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_interfaces_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_scripting_lump_cpp = Module["__GLOBAL__sub_I_runtime_scripting_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_scripting_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_dynamics_lump_cpp = Module["__GLOBAL__sub_I_runtime_dynamics_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_dynamics_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_UnityAdsSettings_cpp = Module["__GLOBAL__sub_I_UnityAdsSettings_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_UnityAdsSettings_cpp"].apply(null, arguments) };
var _memset = Module["_memset"] = function() { return Module["asm"]["_memset"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_utilities_lump_cpp = Module["__GLOBAL__sub_I_runtime_utilities_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_utilities_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_StackTrace_cpp = Module["__GLOBAL__sub_I_StackTrace_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_StackTrace_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_geometry_lump_cpp = Module["__GLOBAL__sub_I_runtime_geometry_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_geometry_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_camera_renderloops_lump_cpp = Module["__GLOBAL__sub_I_runtime_camera_renderloops_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera_renderloops_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_graphics4_lump_cpp = Module["__GLOBAL__sub_I_runtime_graphics4_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_graphics4_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_SwCollision_cpp = Module["__GLOBAL__sub_I_SwCollision_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_SwCollision_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_animation_lump_cpp = Module["__GLOBAL__sub_I_runtime_animation_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_animation_lump_cpp"].apply(null, arguments) };
var _saveSetjmp = Module["_saveSetjmp"] = function() { return Module["asm"]["_saveSetjmp"].apply(null, arguments) };
var _llvm_bswap_i16 = Module["_llvm_bswap_i16"] = function() { return Module["asm"]["_llvm_bswap_i16"].apply(null, arguments) };
var __GLOBAL__sub_I_PxsFluidDynamics_cpp = Module["__GLOBAL__sub_I_PxsFluidDynamics_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_PxsFluidDynamics_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_ThreadImpl_cpp = Module["__GLOBAL__sub_I_ThreadImpl_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_ThreadImpl_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_Class_cpp = Module["__GLOBAL__sub_I_Class_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Class_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_camera2_lump_cpp = Module["__GLOBAL__sub_I_runtime_camera2_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera2_lump_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_Image_cpp = Module["__GLOBAL__sub_I_Image_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Image_cpp"].apply(null, arguments) };
var __GLOBAL__sub_I_runtime_camera_lump_cpp = Module["__GLOBAL__sub_I_runtime_camera_lump_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera_lump_cpp"].apply(null, arguments) };
var _testSetjmp = Module["_testSetjmp"] = function() { return Module["asm"]["_testSetjmp"].apply(null, arguments) };
var __GLOBAL__sub_I_SwSelfCollision_cpp = Module["__GLOBAL__sub_I_SwSelfCollision_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_SwSelfCollision_cpp"].apply(null, arguments) };
var ___cxx_global_var_init13 = Module["___cxx_global_var_init13"] = function() { return Module["asm"]["___cxx_global_var_init13"].apply(null, arguments) };
var __GLOBAL__sub_I_Il2CppCodeRegistration_cpp = Module["__GLOBAL__sub_I_Il2CppCodeRegistration_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Il2CppCo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment